我想让我的应用程序使用动态统一快速列表。为了构建我的应用程序,我使用了C ++和QtCreator IDE。当触发菜单操作时,我希望能够访问我MainWindow
班上的非静态功能,以便能够更新可从“常规” MainWindow函数内部访问的图形用户界面。
因此,我正在建立这样的快速列表(mainwindow.cpp):
void MainWindow::enable_unity_quicklist(){
Unity_Menu = dbusmenu_menuitem_new();
dbusmenu_menuitem_property_set_bool (Unity_Menu, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
Unity_Stop = dbusmenu_menuitem_new();
dbusmenu_menuitem_property_set(Unity_Stop, DBUSMENU_MENUITEM_PROP_LABEL, "Stop");
dbusmenu_menuitem_child_append (Unity_Menu, Unity_Stop);
g_signal_connect (Unity_Stop, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(&fake_callback), (gpointer)this);
if(!unity_entry)
unity_entry = unity_launcher_entry_get_for_desktop_id("myapp.desktop");
unity_launcher_entry_set_quicklist(unity_entry, Unity_Menu);
dbusmenu_menuitem_property_set_bool(Unity_Menu, DBUSMENU_MENUITEM_PROP_VISIBLE, true);
dbusmenu_menuitem_property_set_bool(Unity_Stop, DBUSMENU_MENUITEM_PROP_VISIBLE, true);
}
void MainWindow::fake_callback(gpointer data){
MainWindow* m = (MainWindow*)data;
m->on_stopButton_clicked();
}
void MainWindow::on_stopButton_clicked(){
//stopping the process...
}
mainwindow.h:
private slots:
void enable_unity_quicklist();
void on_stopButton_clicked();
public slots:
static void fake_callback(gpointer data);
此建议来自http://old.nabble.com/Using-g_signal_connect-in-class-td18461823.html
从Unity快速列表中选择“停止”操作后,程序立即崩溃。对该程序进行调试,显示我无法访问on_stopButton_clicked()内部相关的任何MainWindow,而不会崩溃。例如,执行此检查时会崩溃(这是此函数内的前两行代码):
if (!ui->stopButton->isEnabled())
return;
我还测试了我在互联网上发现的许多其他内容,但它们均无效。一种有趣的解决方案是使用gtkmm(http://developer.gnome.org/gtkmm-tutorial/stable/sec-connecting-signal-handlers.html.en),但是我对使用GTK应用程序一无所知(I仅在Qt中工作),我不知道这是否适合我的情况。
编辑:好的,经过大量调查(涉及运行valgrind
),我终于设法弄清了这里发生的情况。您的回叫签名不正确。
静态方法的签名应为:
void MainWindow::fake_callback(DbusmenuMenuitem *, guint, gpointer data)
{
//...
}
注意加DbusmenuMenuitem *
和guint
。第一个是指向发出信号的DBus菜单项的指针,第二个是时间戳。即使您不使用它们,两者也必须存在于签名中。
g_signal_connect
是在运行时调用的,并且无法知道您的函数接受哪些参数,并且假设签名匹配,只能盲目地将参数压入堆栈。(这与您可能在Qt中使用的MOC(元对象编译器)会生成足够的信息来知道您何时尝试将信号连接到具有不兼容签名的插槽的信息有所不同。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句