当我有这个问题的时候,我又回到了同样的位置在 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
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 的一种解决方法。