【问题标题】:Qt issue passing arguments to slotQt问题将参数传递给插槽
【发布时间】:2011-05-08 19:14:05
【问题描述】:

我似乎无法将参数传递给插槽。如果我不传递参数,该函数将正常运行。如果我传递一个参数(整数),我会在编译时收到错误“No such name type”和“No such slot”。

在我的标题中,我声明:

private slots:
void addButton(int);
signals:
void clicked(int)

在我的 Main.cpp 中,我这样做:

int count;
int count = 0;
QPushButton* button = new QPushButton("Button");
_layout->addWidget(button);
connect(button, SIGNAL(clicked(count), this, SLOT(addButton(count)));

....

void Main::addButton(int count) {

//do stuff with count

}

【问题讨论】:

    标签: c++ qt qt4 signals-slots


    【解决方案1】:

    Sebastian 是正确的,您不能以您尝试的方式执行此操作,但是 Qt 确实提供了一个类,可以为您提供所需的功能。

    查看QSignalMapper。它允许您将整数与对象/信号对相关联。然后你连接到它的信号而不是直接连接到按钮。

    【讨论】:

      【解决方案2】:

      我可以看到这三个问题。

      首先,clicked() 信号是由QPushButton 发出的(没有参数),但您试图在自己的类中重新定义它(使用int 参数)。如果你想这样做:

      SignalClass* objectWithSignals = new SignalClass;
      SlotClass* objectWithSlots = new SlotClass;
      connect(objectWithSignals, SIGNAL(a()), objectWithSlots, SLOT(b()));
      

      那么您只能连接到SignalClass 中已经定义的信号。换句话说,信号a()必须属于SignalClass,而不是SlotClass

      (其实clicked()是在QPushButton的基类QAbstractButton中定义的。)

      其次,在connect() 函数中,您需要使用参数types 指定信号和槽签名。 countconnect() 函数中的位置应该是int

      第三,您的连接调用中缺少一个括号:SIGNAL(clicked(count))

      希望对您有所帮助。

      【讨论】:

      • 令我惊讶的是,您的答案是唯一提到在连接调用中将变量名称传递给 SIGNAL 和 SLOT 的参数错误的答案;除非“count”是一种类型,否则示例代码永远不会编译。
      【解决方案3】:

      信号和槽必须具有相同数量和类型的参数,并且您只能将信号的参数传递给槽,而不是您想要的任何变量或值。

      【讨论】:

      • 编辑了上面的代码以反映我尝试过的内容(基于我找到的示例),但仍然无法正常工作。
      • clicked() 信号由按钮类定义,您无法更改它(除非您编写自己的按钮类并这样做,但我怀疑这是否是您尝试的任何解决方案在这里做)。
      猜你喜欢
      • 2022-01-10
      • 2013-11-11
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      • 2012-01-08
      • 2016-09-05
      • 1970-01-01
      相关资源
      最近更新 更多