C++ QPushButton 信号和槽

5

我可以帮您进行翻译,以下是需要翻译的内容:

我在创建 QPushButton 并将其信号与我的槽链接时遇到了问题。首先,我创建了一个带有该槽的类:

class A : public QWidget{

  public slots:
    void handleButton();

};

在 .cpp 文件中有一个名为 handleButton 的函数。

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

但是我在启动应用程序时遇到了一个错误:
"No such slot"

类A:public QWidget{ Q_OBJECT public: A() {}public slots: void handleButton(){ m_button->setText("Example"); // resize button m_button->resize(100,100); }}; 并出现错误:C:\Qt\Tools\QtCreator\bin\untitled3\windowheader.h:9: error: undefined reference to `vtable for A' - Aurimas_12
2
这样下去不行,我建议先学习C++。如果你不先了解C++,就不能使用Qt。 - Marco A.
我需要一些例子来了解C++,我的最大问题是函数,我不知道在按钮被点击时如何使用函数。 - Aurimas_12
你忘记在你的类中使用Q_OBJECT宏了。 - Dmitry Sazonov
请粘贴您的整个代码。您犯了很多错误,很难用您展示的内容进行解释。 - RobbieE
显示剩余4条评论
3个回答

2
请确保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
在这段代码中,您有几个错误,如果您定义了 "void handlebutton()",那么您必须实现 void handlebutton() 而不是 void handlebutton(inx x, int y),这段代码甚至不应该编译。
此外,在QT中,您只能将具有相同参数的SIGNALS和SLOTS连接起来,因此您可以将SIGNAL(clicked())与SLOT(handlebutton())连接起来,但不能将SIGNAL(clicked())与SLOT(handleButton(int, int))连接起来。
另一个问题是connect在运行时执行,因此您必须在Qt显示错误之前进行编译和运行。
因此,可能的解决方案是:
定义和实现槽void handlebutton(),并将其连接到信号clicked(),然后定义另一个方法handleButton(int x,int y),您将从handleButton()内部调用它。
我真的希望这对您有意义。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接