c ++ QPushButton信号和插槽

时间:2014-11-08 14:29:49

标签: c++ qt signals qpushbutton slot

我在使用信号和插槽创建QPushButton时遇到问题。首先我创建了一个类,其中是slot:

class A : public QWidget{

  public slots:
void handleButton();

};

有我的handleButton函数: 在.cpp

   void A::handleButton(int row, int col){
    m_button->setText("Example");
  // resize button
    m_button->resize(100,100);
      }

然后我想连接按钮。

           QObject::connect(m_button, SIGNAL(clicked()),qApp, SLOT(handleButton()));

但是当我启动应用程序时出现错误:   “没有这样的插槽” 任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

确保qApp是类A的对象(即您的广告位定义的位置)。

也就是说,签名是错误的:只有当签名匹配时,信号才会链接到插槽

http://qt-project.org/doc/qt-4.8/signalsandslots.html

  

信号和插槽机制是类型安全的:信号的签名必须与接收插槽的签名匹配。

你的插槽没有正确的签名:

http://qt-project.org/doc/qt-4.8/qabstractbutton.html#clicked

void QAbstractButton::clicked ( bool checked = false ) [signal]

答案 1 :(得分:1)

你在这段代码中有一些错误,如果你定义“void handlebutton()”那么你必须实现void handlebutton()NOT void handlebutton(inx x,int y)这个代码甚至不应该编译。

更多:在QT中你只能使用相同的参数连接SIGNALS和SLOTS,这样你就可以用SIGOT(handlebutton())连接SIGNAL(clicked())而不是SIGNAL(用SLOT点击()(handleButton(int,int) ))。

另一个问题是连接是在运行时执行的,因此必须先编译并运行,然后Qt才能显示错误。

所以可能的解决方案是:

定义并实现slot void handlebutton()并将其连接到clicked()信号,然后定义另一个方法handleButton(int x,int y),您将从handleButton()内部调用。

我真的希望这对你有意义。

答案 2 :(得分:0)

您的班级定义应如下所示:

class A : public QWidget
{
Q_OBJECT
public slots:
  void handleButton(int, int);
};

你应该把它连接起来:

QObject::connect(m_button, SIGNAL(clicked()),qApp, SLOT(handleButton(int a, int b)));

其中ab是行和列的变量。

这应该有效。尝试理解基本的C ++。 :)