c++ - 如何使用参数将信号从 C++ 连接到 QML 函数

标签 c++ qt qml

我想将 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/

相关文章:

c++ - 查找数字数组中出现的特定数字的数量 (C++)

c++ - 在 QTreeView 中隐藏 QStandardItemModel 的 future 列

qt - "var"和 "variant"是同一件事吗?

qt - 使用 ApplicationWindow 时热重载 QML

c++ - 如何在 Qt 中更有效地将标志传递给此函数?

qt - QML,一次编码,两次部署

c++ - 创建我自己的 'data type'

c++ - 以 x86 为目标时在 c++ 中进行算术移位的可靠性

c++ - 如何删除作为 C++ union 的成员变量的字符串对象?

qt - 如何在 Qt 中拥有可拆卸的工具窗口