好像是json文件里不能有order属性。我去掉了重新编译安装,不提示“不兼容”了。不过加载过程很慢啊,出来一堆输出,迟迟不结束,我就ctrl+C了,不过任务栏马上显示出来了。这正常吗? 照理,ctrl+C之后,dde-dock进程应该终止执行了啊,任务栏怎么还能出现呢
这种托盘机制真的太差了,做一个so加载到任务栏进程里?如果so出错,那任务条不废了吗? 用户代码有问题是常事,不应该让用户注入代码到系统程序里,除非迫不得已。
开发部署都巨麻烦。
看你需要的是托盘还是常驻插件啊......
如果只是应用的托盘图标,直接写 Qt 应用,加上 QSystemTrayIcon 系统托盘图标就可以实现了,调试简单,也基本不会因为 dock 接口变动导致各种问题;
如果是需要常驻的插件才要用 so 形式,但凡 api 版本变了就加载不了,带着 dock 一起崩溃......
如楼上所说,可以直接用QSystemTrayIcon;
专业版建议参考开发者平台文档:https://developer.chinauos.com/#document3?dirid=656d342cbd766615b0b02deb&id=656d3508bd766615b0b02e0d
看你需要的是托盘还是常驻插件啊......
如果只是应用的托盘图标,直接写 Qt 应用,加上 QSystemTrayIcon 系统托盘图标就可以实现了,调试简单,也基本不会因为 dock 接口变动导致各种问题;
如果是需要常驻的插件才要用 so 形式,但凡 api 版本变了就加载不了,带着 dock 一起崩溃......
我想在右下角加一个托盘项,鼠标浮上去时显示程序版本,右键单击时显示菜单:登录/退出。这个托盘项是要常驻的。
原本我的程序就是Qt做的,使用了QSystemTrayIcon,可是完全没效果啊,所以我猜想,是不是dde不支持Qt的这个功能,另起炉灶了,所以我就尝试做插件
按照 https://listenerri.com/2019/03/16/dde-dock%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8/ 这里边的做,做到“现在再根据“测试插件加载”一节中的步骤,编译、安装、重启 dde-dock,就可以看到主控件在 dde-dock 面板上出现了,如下图所示:”这一步了,加载时提示不兼容。
现在我到底要如何做?Qt能行,当然用Qt啊,可是为什么没效果,麒麟系统里是有效果的,UOS专业版1060里没效果(托盘不显示)
如楼上所说,可以直接用QSystemTrayIcon;
专业版建议参考开发者平台文档:https://developer.chinauos.com/#document3?dirid=656d342cbd766615b0b02deb&id=656d3508bd766615b0b02e0d
我用Qt做托盘了,没效果,所以才想做插件的:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.hide();
return a.exec();
}
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) , ui(new Ui::MainWindow)
{
ui->setupUi(this);
QIcon icon = QIcon(":/dsslogo.ico");
setWindowIcon(icon);
SysIcon = new QSystemTrayIcon(this);
SysIcon->setIcon(icon);
SysIcon->setToolTip(QString::fromLocal8Bit("xx客户端\n当前用户:"));
menu = new QMenu(this);
m_pLoginAction = new QAction(QIcon(":/dsslogo.ico"), QString("登录"), this);
connect(m_pLoginAction,&QAction::triggered,this,&MainWindow::login);
m_pLogoutAction = new QAction(QIcon(":/dsslogo.ico"), QString("注销"), this);
connect(m_pLogoutAction,&QAction::triggered,this,&MainWindow::logout);
menu->addAction(m_pLoginAction);
SysIcon->setContextMenu(menu);
SysIcon->show();
g_mainwinow = this;
}
没效果
复制的你的代码,没毛病呀,有没有联系方式跟你对接一下
我用Qt做托盘了,没效果,所以才想做插件的:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.hide();
return a.exec();
}
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) , ui(new Ui::MainWindow)
{
ui->setupUi(this);
QIcon icon = QIcon(":/dsslogo.ico");
setWindowIcon(icon);
SysIcon = new QSystemTrayIcon(this);
SysIcon->setIcon(icon);
SysIcon->setToolTip(QString::fromLocal8Bit("xx客户端\n当前用户:"));
menu = new QMenu(this);
m_pLoginAction = new QAction(QIcon(":/dsslogo.ico"), QString("登录"), this);
connect(m_pLoginAction,&QAction::triggered,this,&MainWindow::login);
m_pLogoutAction = new QAction(QIcon(":/dsslogo.ico"), QString("注销"), this);
connect(m_pLogoutAction,&QAction::triggered,this,&MainWindow::logout);
menu->addAction(m_pLoginAction);
SysIcon->setContextMenu(menu);
SysIcon->show();
g_mainwinow = this;
}
没效果
没看出啥问题啊......
试试这个 Demo,我这边可以正常显示在托盘里面,悬浮的时候也有 toolTip,可以正常触发点击,双击,右键菜单。
P.S. 星火商店的托盘也这么写的,没出过问题......
复制的你的代码,没毛病呀,有没有联系方式跟你对接一下
多谢了,我把我的工程简化了一下,只保留了界面相关的,还真显示出来托盘来了。我再检查一下,看哪里错了。搞清楚问题了再来反馈
...........
原来是我代码的问题:
QApplication a(argc, argv);
MainWindow w;
w.hide();
在这之前有一个while循环,如果找不到任务栏进程就一直等待,发现任务栏进程了再往下走,免得我的进程先于任务栏进程启动,徒然地注册托盘。
乌龙了😢
不过有个问题,为什么点了登录并确定之后,托盘的图标变了。代码我上传了,请看一下
多谢了,我把我的工程简化了一下,只保留了界面相关的,还真显示出来托盘来了。我再检查一下,看哪里错了。搞清楚问题了再来反馈
...........
原来是我代码的问题:
QApplication a(argc, argv);
MainWindow w;
w.hide();
在这之前有一个while循环,如果找不到任务栏进程就一直等待,发现任务栏进程了再往下走,免得我的进程先于任务栏进程启动,徒然地注册托盘。
乌龙了😢
不过有个问题,为什么点了登录并确定之后,托盘的图标变了。代码我上传了,请看一下
函数有默认图标参数,应该会显示一个紫色的感叹号来着(Qv2ray 以前就有这个问题)。
可能需要手动设置回去
void QSystemTrayIcon::showMessage(const QString &title, const QString &msg, const QIcon &icon, int msecs = 10000)
可以调用这个啊,写成类似
SysIcon->showMessage("aaa", "bbb", QIcon(":/dsslogo.ico"), 5000);
这样子吧
void QSystemTrayIcon::showMessage(const QString &title, const QString &msg, const QIcon &icon, int msecs = 10000)
可以调用这个啊,写成类似
SysIcon->showMessage("aaa", "bbb", QIcon(":/dsslogo.ico"), 5000);
这样子吧
好的。有效果
我照着
https://github.com/linuxdeepin/dde-dock/blob/master/plugins/plugin-guide/plugins-developer-guide.md
做了个。
这个教程似乎是高版本的,而专业版1060是比较低的版本,所以里边有些地方对不上,比如插件接口类里的某些函数在我的虚拟机里的头文件里并没有,所以我也没有实现。
编译安装后,按照教程所说,执行“pkill dde-dock; dde-dock”命令重新启动任务栏,桌面上出现了提示框:
不知道这是什么意思。
代码很简单: