c++ GTKMM4,动态创建的对话框,显示在不显示任何小部件的窗口上

06odsfpq  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(147)

我有一个“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()。所有工作都很好,信号量只是混淆了问题,结果是不需要的。不知道这是否是最好的解决方案,但至少它对我有效。不介意任何评论,关于这是否是解决问题的最好方法。

thigvfpy

thigvfpy1#

更改Dialog_Show_All_And_Run()函数以删除信号量代码。创建新的Gtk::Application对象,添加窗口DLG,然后通过app->run()运行它。

相关问题