- 主题:Qt程序移植到linux下右键菜单失效
windows下一切正常,左键点击托盘图标应该无效,右键点击应弹出菜单。但该程序在linux下重新编译后,无论是左键还是右键点击托盘图标都是出来一个长条,无菜单。通过日志信息发现onActivatedSysTray槽函数没有被调用,但connect时返回true。请教版上大佬这是什么问题?


系统是Ubuntu18.04,Qt5.12
--
修改:bigsen FROM 223.88.88.*
FROM 223.88.88.*
你前面有调用 trayIcon->setContentMenu() 那么 trayIcon 就会自动弹出菜单,不需要你在 onActivatedSysTray() 里面手动弹出。
edit: 原文说 Qt 在有 contextMenu() 的时候不会触发 activated(Context) 这个说法是错。看代码会会触发的,但貌似我的 xcb 平台不会触发,有空再研究一下。
【 在 bigsen (大海无量) 的大作中提到: 】
: windows下一切正常,左键点击托盘图标应该无效,右键点击应弹出菜单。但该程序在linux下重新编译后,无论是左键还是右键点击托盘图标都是出来一个长条,无菜单。通过日志信息发现onActivatedSysTray槽函数没有被调用,但connect时返回true。请教版上大佬这是什么问题?[
: 系统是Ubuntu18.04,Qt5.12
--
修改:hgoldfish FROM 112.47.122.*
FROM 110.85.22.*
具体原因其实我也不清楚。有可能是桌面环境的问题。
不过仅就你目前的代码,随便说两句:
1. QIcon() 的内容,建议放在 qrc 文件里面。省得布署的时候搞错。
2. 对你这种在 win32/linux 之间跨平台的程序而言,QString::fromLocal8Bit() 几乎肯定是个错误。
3. tranIcon 创建完要调用 tranIcon->show()
你可以改完试一下在 KDE 或者 xfce 里面是不是正常的。ubuntu 的 gnome 桌面 BUG 很多。
【 在 bigsen (大海无量) 的大作中提到: 】
: windows下一切正常,左键点击托盘图标应该无效,右键点击应弹出菜单。但该程序在linux下重新编译后,无论是左键还是右键点击托盘图标都是出来一个长条,无菜单。通过日志信息发现onActivatedSysTray槽函数没有被调用,但connect时返回true。请教版上大佬这是什么问题?[
: 系统是Ubuntu18.04,Qt5.12
--
FROM 112.47.122.*
setContextMenu只是把自定义的右键菜单与SystemTrayIcon关联起来,这样鼠标对trayIcon的操作才能得到正确的响应吧
【 在 hgoldfish 的大作中提到: 】
: 你前面有调用 trayIcon->setContentMenu() 那么 trayIcon 就会自动弹出菜单,不需要你在 onActivatedSysTray() 里面手动弹出。
: 事实上,,activated() 只会在没有被调用 setContextMenu() 的时候才会发送 activated() 信号。
:
--
FROM 223.88.88.*
不用的。。你看看我写的一个小 demo:
https://github.com/hgoldfish/lafdup/blob/master/lafdup_window.cpp#L155
或者自己做个实验也可以知道。
更正:我看了一下 Qt 的源代码,发现我上面说的一件是错的。在自动弹出菜单之前,Qt 仍然会触发 activated(Context) 这个事件。
【 在 bigsen (大海无量) 的大作中提到: 】
: setContextMenu只是把自定义的右键菜单与SystemTrayIcon关联起来,这样鼠标对trayIcon的操作才能得到正确的响应吧
--
修改:hgoldfish FROM 112.47.122.*
FROM 112.47.122.*
1、移植到linux后,出现了中文乱码问题,尝试了很方法都不行,后来通过先设置
QTextCodec *codec = QTextCodec::codecForName("GBK");
QTextCodec::setCodecForLocale(codec);,
设置中文名称的时候再使用QString::fromLocal8Bit("中文"),才解决了这个问题。
这样使用有什么问题么?那正确的方式应该时什么?
2、添加了this->trayIcon->setVisible(true);并this->trayIcon->show();问题依旧。我再试试其它桌面环境下怎么样。
3、其实我的目标机是个小型工控机,arm cpu,借此也想请教个工程化的问题,虽然我的目标环境是一个带有图形桌面的完整linux环境,但一般情况下,针对工控或者嵌入式,大家是不是都是采用无界面的存命令行程序?那如果有一些信息需要输出的话,都依赖于记录日志的方式么?如果是工程调试时,可能需要人工手动发送若干命令,这种需求通常做法是什么?
【 在 hgoldfish 的大作中提到: 】
: 具体原因其实我也不清楚。有可能是桌面环境的问题。
: 不过仅就你目前的代码,随便说两句:
: 1. QIcon() 的内容,建议放在 qrc 文件里面。省得布署的时候搞错。
: ...................
--
FROM 223.88.88.*
你这方法仍然不对:
1. 源代码应该要坚持 utf-8
2. 用 QString::fromUtf8() 把源代码里面的字符转成 str.
3. 在 win32 msvc 编译器里面,设置编译期参数 /utf8
4. 在与操作系统打交道的时候,才用 QString::fromLocal8Bit(),比如读取本地文本文件。
【 在 bigsen (大海无量) 的大作中提到: 】
: 1、移植到linux后,出现了中文乱码问题,尝试了很方法都不行,后来通过先设置
: QTextCodec *codec = QTextCodec::codecForName("GBK");
: QTextCodec::setCodecForLocale(codec);,
: ...................
--
FROM 112.47.122.*
源码好像默认就是是utf-8吧。
Ubuntu下QtCreator打开源码,文件里面的注释全都是乱码,每次都需要select encoding,然后选择GBK。
2、this->action_show->setText(QString::fromUtf8("显示窗口")); 经试验,这种方式也还是乱码。
【 在 hgoldfish 的大作中提到: 】
: 你这方法仍然不对:
: 1. 源代码应该要坚持 utf-8
: 2. 用 QString::fromUtf8() 把源代码里面的字符转成 str.
: ...................
--
FROM 223.88.88.*
1. 你在 windows 底下编写的吧?一般是默认 GBK
2. 有三个地方的编译要统一:源代码、编译器存储到 exe 的编码、把 bytes 转到 str 的编码。总之,这个事情没那么简单,你仔细看一下相关的知识吧。
【 在 bigsen (大海无量) 的大作中提到: 】
: 源码好像默认就是是utf-8吧。
: Ubuntu下QtCreator打开源码,文件里面的注释全都是乱码,每次都需要select encoding,然后选择GBK。
: 2、this->action_show->setText(QString::fromUtf8("显示窗口")); 经试验,这种方式也还是乱码。
: ...................
--
FROM 112.47.122.*