我有一个“mygtk”库,它执行各种功能,使编写我的gtkmm应用程序更容易。我已经将库转换为gtkmm 4,并且在显示应用程序的窗口时遇到问题。该窗口将在输入验证错误时显示,并显示错误消息,说明问题所在。我可以动态创建对话框ok,我已经为任何按钮设置了信号处理程序,现在只想显示它。当我使用dialog-〉show()我所看到的是我给它的窗口和标题,但没有任何小部件显示。我使用的代码如下所示,其中DLG是我动态创建的对话框,并为按钮等设置了处理程序。
Gtk::ResponseType MyGtk::Dialog_Show_All_And_Run(Gtk::Window *dlg)
{
Gtk::ResponseType gtk_response;
//
// First we must ensure that the dialog is not null before we attempt
// to de - reference it.
//
assert(dlg);
//
// Next we must show all of the widgets in the dialog DLG.
//
Widget_Show(dlg);
//
//Now we need to obtain a lock the dialog/response semaphore. This will
//be unlocked once the above callback handler has set the response into
//the return response variable.
//
Dialog_Response_Semaphore_Lock();
//
// Now we need to convert the returned response to a gtk reponse so we
// can subsequently return it.
//
gtk_response = static_cast<Gtk::ResponseType>(i_dialog_response);
//
//Now that we have fetched the dialog/response from the callback
//handler, we can now unlock the semaphore and return it to the
//initial state.
//
Dialog_Response_Semaphore_Unlock();
//
//Finally, we can return the response to the caller.
//
return gtk_response;
}
widgetshow例程只是执行一个dlg-〉show()for gtkmm 4.我正在使用信号量来阻止显示的窗口立即退出。这个想法是,信号量的初始状态是这样的,“锁定”调用将不得不等待,直到按钮处理程序将对话框响应设置为i_dialog_response,然后进行解锁。这将导致“锁定”以成功并且然后上述可以获取响应,解锁信号量以使其返回到初始状态,然后返回响应。在gtkmm 3下,这工作正常,但在我的代码中,gtkmm 4有一些错误。Hvae不知道是什么,并在我的一个使用'mygtk'的应用程序上尝试了GTK_DEBUG=interactive库,我可以看到应用程序窗口。当我输入一些无效的数据到一个条目,然后点击返回对话框应该弹出一个错误消息。我看到的是,窗口弹出,显示标题,没有小部件。我写在C++,但如果有人可以帮助,一个C的例子将澄清我做错了什么。
放入调试代码以确保在对话框中创建小部件,并且gtkmm 4代码现在使用'set_child'而不是gtkmm 3中的'add'。运行我的一个应用程序时尝试了GTK_DEBUG=interactive,可以看到应用程序窗口,但当对话框显示窗口和标题时,我无法看到此窗口以了解发生了什么。
除此之外,我最终发现了我做错了什么。这真的很简单。在Dialog_Show_All_And_Run()函数中,我创建了一个Gtk::Application对象,添加了窗口DLG到其中,然后执行了app-〉run()。所有工作都很好,信号量只是混淆了问题,结果是不需要的。不知道这是否是最好的解决方案,但至少它对我有效。不介意任何评论,关于这是否是解决问题的最好方法。
1条答案
按热度按时间thigvfpy1#
更改
Dialog_Show_All_And_Run()
函数以删除信号量代码。创建新的Gtk::Application
对象,添加窗口DLG,然后通过app->run()
运行它。