解决信号和插槽参数限制的问题

时间:2012-09-27 08:53:03

标签: qt qt4

我想在点击时创建一个PushButton,它的文本会变成'clicked'。我试过了

connect(button1, SIGNAL(clicked()), this, SLOT(markClicked(button1))); 

其中this引用MainWindow

void MainWindow::markClicked(QPushButton *button) { button->setText("Clicked"); }

它似乎不起作用,因为我认为SLOT不能比SIGNAL采取更多的参数。如果有任何方法可以解决这个限制吗?

感谢。

2 个答案:

答案 0 :(得分:3)

Qt信号/插槽机制只能通过类似参数将信号传输到插槽功能。作为解决方法,您应该使用QSignalMapper

QSignalMapper mapper;
...
connect(button1, SIGNAL(clicked()), &mapper, SLOT(map()));
mapper.setMapping(button1, button1); // not sure whether this is mandatory or not
...
connect(&mapper, SIGNAL(mapped(QWidget*)), this, SLOT(markClicked(QWidget*)));

和函数 markClicked

void MainWindow::markClicked(QWidget *widget) {
  QPushButton *button = qobject_cast<QPushButton*>(widget);
  button->setText("Clicked");
}

答案 1 :(得分:1)

另一种方法是使用参数的默认值,然后使用sender()方法:

在MainWindow中:
    void markClicked(QPushButton *button = NULL);

然后:
connect(button1, SIGNAL(clicked()), this, SLOT(markClicked()));

void MainWindow::markClicked(QPushButton *button) {
   if (button==NULL) { button = qobject_cast<QPushButton*>(sender()); }
    button->setText("Clicked");
}