在C ++中将g_signal_connect()用于动态统一快速列表的正确方法是什么?

玻璃体

我想让我的应用程序使用动态统一快速列表。为了构建我的应用程序,我使用了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中工作),我不知道这是否适合我的情况。

内森·奥斯曼(Nathan Osman)

编辑:好的,经过大量调查(涉及运行valgrind),我终于设法弄清了这里发生的情况。您的回叫签名不正确。

静态方法的签名应为:

void MainWindow::fake_callback(DbusmenuMenuitem *, guint, gpointer data)
{
    //...
}

注意加DbusmenuMenuitem *guint第一个是指向发出信号的DBus菜单项的指针,第二个是时间戳。即使您不使用它们,两者也必须存在于签名中。

g_signal_connect是在运行时调用的,并且无法知道您的函数接受哪些参数,并且假设签名匹配,只能盲目地将参数压入堆栈。(这与您可能在Qt中使用的MOC(元对象编译器)会生成足够的信息来知道您何时尝试将信号连接到具有不兼容签名的插槽的信息有所不同。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C ++中将g_signal_connect()用于动态统一快速列表的正确方法是什么?

来自分类Dev

C ++ g_signal_connect传递数据

来自分类Dev

C ++,将g_signal_connect事件正确添加到按钮

来自分类Dev

C - GTKUibuilder - Glade - g_signal_connect 错误

来自分类Dev

GTK C-使用g_signal_connect传递多个变量

来自分类Dev

GTK+/C:通过 g_signal_connect 传递数据改变数据

来自分类Dev

在C中将指针传递给数组的正确方法是什么?

来自分类Dev

快速思考受C#保护的访问器的正确方法是什么?

来自分类Dev

用于快速搜索的数据结构是什么?(C#)

来自分类Dev

在C#中将动态行数插入SQL Server的最佳方法是什么

来自分类Dev

使用C#对列表<string>进行排序的正确方法是什么?

来自分类Dev

在c ++中拥有一组结构的正确方法是什么?

来自分类Dev

在C ++中平均一组复数的正确方法是什么?

来自分类Dev

编码 SIMD 类型和将它们用于 Objective-C 运行时的函数的正确方法是什么?

来自分类Dev

在C ++中动态分配向量的安全方法是什么

来自分类Dev

c ++ 11统一初始化不适用于“ g ++ -std = c ++ 0x”

来自分类Dev

在现代C ++中实现聚合的正确方法是什么?

来自分类Dev

在C中实现椭圆方程的正确方法是什么?

来自分类Dev

在C ++中调用构造函数的正确方法是什么?

来自分类Dev

使用结构指针和C接口的“正确”方法是什么?

来自分类Dev

使用c ++ 11线程返回结果的正确方法是什么?

来自分类Dev

C#方法签名-限制类型-正确的术语是什么?

来自分类Dev

定义此C宏的正确方法是什么?

来自分类Dev

gtkd addOnClicked / g_signal_connect失败

来自分类Dev

使用g_signal_connect右键单击?

来自分类Dev

QtGstreamer和g_signal_connect

来自分类Dev

在C / C ++中将rand_r用于多线程程序的正确方法

来自分类Dev

在Objective-C中将对象传递给另一个类的最佳方法是什么?

来自分类Dev

在 Python 中编译和连接 C DLL 适用于 Unix,但不适用于 Windows。这样做的正确方法是什么?

Related 相关文章

  1. 1

    在C ++中将g_signal_connect()用于动态统一快速列表的正确方法是什么?

  2. 2

    C ++ g_signal_connect传递数据

  3. 3

    C ++,将g_signal_connect事件正确添加到按钮

  4. 4

    C - GTKUibuilder - Glade - g_signal_connect 错误

  5. 5

    GTK C-使用g_signal_connect传递多个变量

  6. 6

    GTK+/C:通过 g_signal_connect 传递数据改变数据

  7. 7

    在C中将指针传递给数组的正确方法是什么?

  8. 8

    快速思考受C#保护的访问器的正确方法是什么?

  9. 9

    用于快速搜索的数据结构是什么?(C#)

  10. 10

    在C#中将动态行数插入SQL Server的最佳方法是什么

  11. 11

    使用C#对列表<string>进行排序的正确方法是什么?

  12. 12

    在c ++中拥有一组结构的正确方法是什么?

  13. 13

    在C ++中平均一组复数的正确方法是什么?

  14. 14

    编码 SIMD 类型和将它们用于 Objective-C 运行时的函数的正确方法是什么?

  15. 15

    在C ++中动态分配向量的安全方法是什么

  16. 16

    c ++ 11统一初始化不适用于“ g ++ -std = c ++ 0x”

  17. 17

    在现代C ++中实现聚合的正确方法是什么?

  18. 18

    在C中实现椭圆方程的正确方法是什么?

  19. 19

    在C ++中调用构造函数的正确方法是什么?

  20. 20

    使用结构指针和C接口的“正确”方法是什么?

  21. 21

    使用c ++ 11线程返回结果的正确方法是什么?

  22. 22

    C#方法签名-限制类型-正确的术语是什么?

  23. 23

    定义此C宏的正确方法是什么?

  24. 24

    gtkd addOnClicked / g_signal_connect失败

  25. 25

    使用g_signal_connect右键单击?

  26. 26

    QtGstreamer和g_signal_connect

  27. 27

    在C / C ++中将rand_r用于多线程程序的正确方法

  28. 28

    在Objective-C中将对象传递给另一个类的最佳方法是什么?

  29. 29

    在 Python 中编译和连接 C DLL 适用于 Unix,但不适用于 Windows。这样做的正确方法是什么?

热门标签

归档