如何使用参数将来自C ++的信号连接到QML函数

时间:2016-04-29 11:48:56

标签: c++ qt qml

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

2 个答案:

答案 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);
          });