我想将 C++ QObject 创建的信号连接到 QML 项中的函数。该信号是来自 QSystemTrayIcon 的“已激活”信号,其参数是 ActivationReason(枚举值)。
不幸的是,我似乎无法将带有此签名的信号连接到似乎只能接收 QVariant 的插槽。
在QML文件中
function trayIconClicked(reason) { ... }
在 C++ 代码中
QObject::connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), rootObject, SLOT(trayIconClicked(QVariant)));
这就是我得到的
QObject::connect: Incompatible sender/receiver arguments
QSystemTrayIcon::activated(QSystemTrayIcon::ActivationReason) --> ApplicationWindow_QMLTYPE_11_QML_60::trayIconClicked(QVariant)
如果我完全放弃插槽端的参数,事件将调用该函数。但是后来我不知道是什么 ActivationReason 触发了它。
上面代码的完整工作版本在这里,除了我不能提交原因参数 https://github.com/sturmf/qt_samples/tree/master/trayicon
最佳答案
我现在对 QSystemTrayicon 进行了子类化,并添加了一个插槽,它可以在没有参数的情况下发出另一个信号。
#ifndef TRAYICON_H
#define TRAYICON_H
#include <iostream>
#include <QObject>
#include <QSystemTrayIcon>
class TrayIcon : public QSystemTrayIcon
{
Q_OBJECT
public:
explicit TrayIcon(QObject *parent = 0) : QSystemTrayIcon(parent){}
signals:
void triggered();
public slots:
void trayIconActivated(QSystemTrayIcon::ActivationReason reason) {
std::cout << "activated" << std::endl;
if (reason == QSystemTrayIcon::Trigger) {
std::cout << "tiggered" << std::endl;
emit triggered();
}
}
};
#endif // TRAYICON_H
关于c++ - 如何使用参数将信号从 C++ 连接到 QML 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36937613/