我想将由C ++ QObject创建的信号连接到QML项目中的函数。信号是来自QSystemTrayIcon的“激活”信号,其参数是ActivationReason(枚举值)。
不幸的是,似乎我无法将带有此签名的信号连接到一个似乎只能接收QVariant的插槽。
在QML文件中
series: [{
type: "treemap",
allowDrillToNode: true,
alternateStartingDirection: true,
levels: [{
level: 1,
layoutAlgorithm: 'squarified',
dataLabels: {
enabled: true,
align: 'left',
verticalAlign: 'top',
style: {
fontSize: '15px',
fontWeight: 'bold'
}
}
}, {
level: 2,
layoutAlgorithm: 'stripes',
color: 'blue'
}],
//...
在C ++代码中
function trayIconClicked(reason) { ... }
这就是我得到的
QObject::connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), rootObject, SLOT(trayIconClicked(QVariant)));
如果我完全删除了插槽侧的参数,则事件会调用该函数。但后来我不知道ActivationReason是什么触发了它。
上面代码的完整工作版本在这里,除了我无法提交原因参数https://github.com/sturmf/qt_samples/tree/master/trayicon
答案 0 :(得分:0)
我现在将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
答案 1 :(得分:0)
顺便说一下,在Qt5中你可以连接匿名函数。
QObject::connect(trayIcon
, SIGNAL(activated(QSystemTrayIcon::ActivationReason))
, [=](QSystemTrayIcon::ActivationReason r){
rootObject->trayIconClicked(r);
});