0

我正在使用 c++ Qt 库,我想做一些可以做到的事情:

connect(actionB11, SIGNAL(triggered()), this, SLOT(SetSomething(1, 1)));
connect(actionB12, SIGNAL(triggered()), this, SLOT(SetSomething(1, 2)));
connect(actionB21, SIGNAL(triggered()), this, SLOT(SetSomething(2, 1)));
connect(actionB22, SIGNAL(triggered()), this, SLOT(SetSomething(2, 2)));

上面的代码不起作用,因为 SIGNAL 函数必须具有与 SLOT 函数相同的数字和参数类型。

是否存在一种方法来做到这一点?我不想有大约 20 个函数作为 SetSomething11、SetSomething12 调用 SetSomething(1, 1) 等。

4

3 回答 3

0

您可以修改 QAction 类。

class QMyAction : public QAction
{
    Q_OBJECT
    QMyAction ( QObject * parent ) : 
    QAction(parent), _x(0), _y(0)
    {
         connect(this, SIGNAL(triggered(bool)), this, SLOT(re_trigger(bool)));
    } 
    QMyAction ( const QString & text, QObject * parent ) : 
    QAction (text, parent), _x(0), _y(0)
    {
         connect(this, SIGNAL(triggered(bool)), this, SLOT(re_trigger(bool)));
    }
    QMyAction ( const QIcon & icon, const QString & text, QObject * parent ) : 
    QAction(icon, text, parent), _x(0), _y(0)
    {
         connect(this, SIGNAL(triggered(bool)), this, SLOT(re_trigger(bool)));
    }
    void setX(int x)
    {
        _x = x;
    }
    int getX()
    {
        return _x;
    }
    void setY(int y)
    {
        _y = y;
    }
    int getY()
    {
        return _y;
    }

public slots:
    void re_trigger(bool)
    {
        emit triggered(_x, _y);
    }

signals:
    void triggered(int,int);

private:
    int _x;
    int _y;
};

现在,您可以将trigger(int,int) 连接到SetSomething(int,int)。但是,您必须设置 x 和 y。除非,它们将始终为 0。

于 2012-10-22T10:56:36.147 回答
0

在这种情况下,您有三个简单的选择:

  1. 将每个 QAction 连接到自己的插槽(不好)
  2. 使用QSignalMapper
  3. 将每个 QAction 添加到QActionGroup并使用QActionGroup::triggered(QAction*)信号,同时设置每个 QAction 的数据(参见QAction::setData()QAction::data()

当您为一个QAction 设置数据时,您只能存储一个QVariant(即一个值)。因此,如果您想要两个值,我建议您只创建一个简单的映射,如下所示:

void Window::onActionGroupTriggered(QAction *action);
{
    int i = action->data().toInt();
    int a, b;
    a = i / 10;
    b = i - 10;
    setSomething(a, b); // for example if i = 15, then a = 1 and b = 5
}
于 2012-10-22T10:57:23.267 回答
0

你不能在 SLOT 签名中使用常量,你必须在那里使用类型。将信号连接到槽时,槽必须具有与信号相同的参数子集,否则它们无法连接并且 QObject::connect() 将返回 false。

connect(actionB11, SIGNAL(triggered()),
        this, SLOT(SetSomething()));

此插槽不带参数,但您可以使用 QObject::sender() 获取指向发出信号的对象的指针。那么这个指针可以用来区分信号的来源:

void SetSomething() {
    switch(sender()) {
    case actionB11;
        // do something
        break;
    case actionB12;
        // do something
        break;
    case actionB21;
        // do something
        break;
    case actionB22;
        // do something
        break;
    default:
        // Exceptional situation
    }
}

或者,您可以使用QSignalMapper将其他区分参数附加到插槽。

于 2012-10-22T11:01:44.173 回答