[DTK] 专业版1060里边,怎么开发托盘 Resolved
Tofloor
poster avatar
神经蛙
deepin
2024-04-24 23:10
Author

我照着

https://github.com/linuxdeepin/dde-dock/blob/master/plugins/plugin-guide/plugins-developer-guide.md

做了个。

这个教程似乎是高版本的,而专业版1060是比较低的版本,所以里边有些地方对不上,比如插件接口类里的某些函数在我的虚拟机里的头文件里并没有,所以我也没有实现。

编译安装后,按照教程所说,执行“pkill dde-dock; dde-dock”命令重新启动任务栏,桌面上出现了提示框:

截图1713971181.jpg

不知道这是什么意思。

代码很简单:

#ifndef HOMEMONITORPLUGIN_H
#define HOMEMONITORPLUGIN_H

#include 

#include 
#include "dsslogin.h"

HomeMonitorPlugin::HomeMonitorPlugin(QObject *parent)
    : QObject(parent)
{

}

const QString HomeMonitorPlugin::pluginName() const
{
    return QStringLiteral("dsslogin");
}

void HomeMonitorPlugin::init(PluginProxyInterface *proxyInter)
{
    m_proxyInter = proxyInter;
}

QWidget *HomeMonitorPlugin::itemWidget(const QString &itemKey)
{
    Q_UNUSED(itemKey);

    // 这里暂时返回空指针,这意味着插件会被 dde-dock 加载
    // 但是不会有任何东西被添加到 dde-dock 上
    return nullptr;
}

json文件的内容是这样的:

{
"api": "1.2",
"order": 1
}

不知道问题出在在哪里了。国产系统文档不详细,接口也老变化。不同的系统可能采用不同的库版本,对于编程开发真的很不利

Reply Favorite View the author
All Replies
神经蛙
deepin
2024-04-24 23:21
#1

好像是json文件里不能有order属性。我去掉了重新编译安装,不提示“不兼容”了。不过加载过程很慢啊,出来一堆输出,迟迟不结束,我就ctrl+C了,不过任务栏马上显示出来了。这正常吗? 照理,ctrl+C之后,dde-dock进程应该终止执行了啊,任务栏怎么还能出现呢

Reply View the author
神经蛙
deepin
2024-04-25 09:45
#2

这种托盘机制真的太差了,做一个so加载到任务栏进程里?如果so出错,那任务条不废了吗? 用户代码有问题是常事,不应该让用户注入代码到系统程序里,除非迫不得已。

开发部署都巨麻烦。

Reply View the author
忘记、过去
deepin
2024-04-25 10:50
#3

看你需要的是托盘还是常驻插件啊......


如果只是应用的托盘图标,直接写 Qt 应用,加上 QSystemTrayIcon 系统托盘图标就可以实现了,调试简单,也基本不会因为 dock 接口变动导致各种问题;

如果是需要常驻的插件才要用 so 形式,但凡 api 版本变了就加载不了,带着 dock 一起崩溃......

Reply View the author
wangshaojun_cm
deepin
2024-04-25 11:17
#4

如楼上所说,可以直接用QSystemTrayIcon;

专业版建议参考开发者平台文档:https://developer.chinauos.com/#document3?dirid=656d342cbd766615b0b02deb&id=656d3508bd766615b0b02e0d

Reply View the author
神经蛙
deepin
2024-04-25 11:23
#5
忘记、过去

看你需要的是托盘还是常驻插件啊......


如果只是应用的托盘图标,直接写 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里没效果(托盘不显示)

Reply View the author
神经蛙
deepin
2024-04-25 11:29
#6
wangshaojun_cm

如楼上所说,可以直接用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;
}



没效果

Reply View the author
wangshaojun_cm
deepin
2024-04-25 13:31
#7

image.png
image.png

复制的你的代码,没毛病呀,有没有联系方式跟你对接一下

Reply View the author
忘记、过去
deepin
2024-04-25 13:46
#8
神经蛙

我用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;
}



没效果

没看出啥问题啊......


SystemTrayIconDemo.zip

试试这个 Demo,我这边可以正常显示在托盘里面,悬浮的时候也有 toolTip,可以正常触发点击,双击,右键菜单。

P.S. 星火商店的托盘也这么写的,没出过问题......

Reply View the author
神经蛙
deepin
2024-04-25 14:05
#9
wangshaojun_cm

image.png
image.png

复制的你的代码,没毛病呀,有没有联系方式跟你对接一下

多谢了,我把我的工程简化了一下,只保留了界面相关的,还真显示出来托盘来了。我再检查一下,看哪里错了。搞清楚问题了再来反馈

...........

原来是我代码的问题:

QApplication a(argc, argv);
MainWindow w;
w.hide();

在这之前有一个while循环,如果找不到任务栏进程就一直等待,发现任务栏进程了再往下走,免得我的进程先于任务栏进程启动,徒然地注册托盘。
乌龙了😢

不过有个问题,为什么点了登录并确定之后,托盘的图标变了。代码我上传了,请看一下

dsslogin2.zip

Reply View the author
忘记、过去
deepin
2024-04-25 14:48
#10
神经蛙

多谢了,我把我的工程简化了一下,只保留了界面相关的,还真显示出来托盘来了。我再检查一下,看哪里错了。搞清楚问题了再来反馈

...........

原来是我代码的问题:

QApplication a(argc, argv);
MainWindow w;
w.hide();

在这之前有一个while循环,如果找不到任务栏进程就一直等待,发现任务栏进程了再往下走,免得我的进程先于任务栏进程启动,徒然地注册托盘。
乌龙了😢

不过有个问题,为什么点了登录并确定之后,托盘的图标变了。代码我上传了,请看一下

dsslogin2.zip

截图_选择区域_20240425144705.png

函数有默认图标参数,应该会显示一个紫色的感叹号来着(Qv2ray 以前就有这个问题)。

可能需要手动设置回去

Reply View the author
神经蛙
deepin
2024-04-25 15:52
#11
It has been deleted!
忘记、过去
deepin
2024-04-25 15:57
#12
神经蛙 It has been deleted!

void QSystemTrayIcon::showMessage(const QString &title, const QString &msg, const QIcon &icon, int msecs = 10000)

可以调用这个啊,写成类似

SysIcon->showMessage("aaa", "bbb", QIcon(":/dsslogo.ico"), 5000);

这样子吧

Reply View the author
神经蛙
deepin
2024-04-25 16:01
#13
忘记、过去

void QSystemTrayIcon::showMessage(const QString &title, const QString &msg, const QIcon &icon, int msecs = 10000)

可以调用这个啊,写成类似

SysIcon->showMessage("aaa", "bbb", QIcon(":/dsslogo.ico"), 5000);

这样子吧

好的。有效果

Reply View the author