对于 Qt,使用“scroll-event”信号(在指示器上)的正确方法是什么?

对于 Qt,使用“scroll-event”信号(在指示器上)的正确方法是什么?

当我有这个问题的时候,我又回到了同样的位置在 C++ 中,对于动态统一快速列表,使用 g_signal_connect() 的正确方法是什么?

在那里,我被告知我的静态方法的签名不正确,我必须在其他方法前面添加一个 guint 参数。现在我遇到了同样的问题,但对于调用“scroll-event”信号的函数,我想将其发送到我的指示器上。

进一步来说:

//connecting indicator with the scroll-event and altogether with the function indicator_scrolled
g_signal_connect(G_OBJECT(appindicator), "scroll-event", G_CALLBACK(&indicator_scrolled), (gpointer)this);

这是函数indicator_scrolled:

gboolean indicator_scrolled(GtkStatusIcon  *status_icon, GdkEventScroll *event, gpointer data){
    cout << "The indicator was scrolled\n";
    MainWindow* m = (MainWindow*)data;
    m->action_on_scroll();
}

我可以看到“指示器已滚动”消息,但程序崩溃了。在其他参数前面添加一个 guint 参数并没有解决问题。

那么,这个函数的正确签名是什么才能使其工作?我如何才能每次都找到正确的签名以避免此类问题?(另一个问题用户 George Edison 谈到了,valgrind但他没有澄清)

请不要建议 AppIndicators 不是与 Ubuntu+Qt 配合使用的正确方法,请参阅问题让 sniqt 识别所有托盘功能(或在 Qt 中创建工作指示器)

编辑:经过测试,我偶然发现需要在 GtkStatusIcon 和 GdkEventScroll 参数之间放置一个 guint 参数。但我真的想知道一种方法来找出正确的函数签名。

答案1

看一下参考手册:https://web.archive.org/web/20130604060558/http://developer.ubuntu.com/api/ubuntu-12.04/c/appindicator/libappindicator-app-indicator.html#AppIndicator-scroll-event

arg0 : The AppIndicator object
arg1 : How many steps the scroll wheel has taken
arg2 : (type Gdk.ScrollDirection) Which direction the wheel went in
user_data : user data set when the signal handler was connected.

答案2

截至今天,经过一些搜索和尝试,这是我的工作滚动事件回调:

static void indicator_scrolled(AppIndicator *indicator, guint steps, GdkScrollDirection direction)
{
    if (direction == GDK_SCROLL_DOWN)
        g_print("DOWN\n");
    else if (direction == GDK_SCROLL_UP)
        g_print("UP\n");
    else if (direction == GDK_SCROLL_SMOOTH)
       g_print("SMOOTH\n");
}

在滚动过程中,我只收到一次向上/向下按钮,然后是一些平滑按钮(在同一方向)。

我不知道如何管理平滑方向,因为我需要在任何地方都看不到的 GdkEventScroll 结构;我正在我的应用程序指示器上实现音量增大/减小,并且我将维护一个全局方向标志,以便以下平滑将应用于当前方向,但我认为这只是对混乱且记录不佳的实现 libappindicator 的一种解决方法。

相关内容