c++ QPushButton信号和槽

Posted

技术标签:

【中文标题】c++ QPushButton信号和槽【英文标题】:c++ QPushButton signal and slot 【发布时间】:2014-11-08 14:29:48 【问题描述】:

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

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()));

但是当我启动应用程序时出现错误: “没有这样的插槽” 谁能帮帮我?

【问题讨论】:

qApp 是 A 类的实例吗?而且签名也是错误的 我是 C++ 新手,我不知道如何设置正确的实例。 如果 qApp 不是 A 类的对象,它就没有那个槽。 class A : public QWidget Q_OBJECT public: A() public slots: void handleButton() m_button->setText("Example"); // 调整按钮大小 m_button->resize(100,100); ;并得到错误:C:\Qt\Tools\QtCreator\bin\untitled3\windowheader.h:9: error: undefined reference to `vtable for A' 这行不通,我建议先学习 C++。不懂C++就不能用Qt 【参考方案1】:

确保qAppA 类的对象(即定义槽的位置)。

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

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]

【讨论】:

【参考方案2】:

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

更多:在 QT 中,您只能使用相同的参数连接 SIGNAL 和 SLOTS,因此您可以将 SIGNAL(clicked()) 与 SLOT(handlebutton()) 连接,但不能将 SIGNAL(clicked() 与 SLOT(handleButton(int, int) 连接))。

另一个问题是connect是在运行时执行的,所以你必须在Qt显示错误之前编译和运行。

所以一个可能的解决方案是:

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

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

【讨论】:

【参考方案3】:

您的类定义应如下所示:

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++。 :)

【讨论】:

以上是关于c++ QPushButton信号和槽的主要内容,如果未能解决你的问题,请参考以下文章

信号和槽初始

信号和槽初始

QT学习-标准信号窗口和槽

QT学习-标准信号窗口和槽

在Qt Creator 和在 vs2012 里添加信号和槽

在 main.cpp 中定义信号和槽