QObject :: sender()在插槽中无法正常工作

时间:2016-04-23 16:37:23

标签: c++ qt

我想制作一个按钮,在点击后保持按下状态。所以我创建了一个make_pushed插槽,我尝试将其用于此目的。单击的按钮由QObject :: sender()方法标识。但是出了问题,因为它没有用。

 QPushButton * size=new QPushButton("size",this);    
 connect(size, SIGNAL(clicked()), this, SLOT(make_pushed()));
 void Window4::make_pushed()
{
  QObject* sender = this->sender();
  QPushButton* button = qobject_cast<QPushButton*>(sender);
   button->setDown(true);
   button->setText("Yep");
}


class Window4 : public QWidget
{
public:
   Window4(QWidget * parent=0);
private slots:
   void make_pushed();
 };

应用程序输出中出现错误&#34; QObject :: connect:&#34;中没有这样的插槽QWidget :: make_pushed() ,虽然一切都编译,窗口出现。问题是显然找不到插槽,尽管它位于同一个cpp文件和标头中。因此,当点击时,按钮更改其文本也不会被推动。

1 个答案:

答案 0 :(得分:1)

您刚忘记了类声明http://doc.qt.io/qt-5/qobject.html中的Q_OBJECT宏:

  

请注意,Q_OBJECT宏对于实现信号,插槽或属性的任何对象都是必需的。您还需要在源文件上运行元对象编译器。我们强烈建议在QObject的所有子类中使用此宏,无论它们是否实际使用信号,插槽和属性,因为如果不这样做可能会导致某些函数出现奇怪的行为。

http://doc.qt.io/qt-5/qobject.html#Q_OBJECT

  

Q_OBJECT宏必须出现在类定义的私有部分中,该部分定义声明自己的信号和插槽,或使用Qt的元对象系统提供的其他服务。

     

注意:此宏要求该类是QObject的子类。使用Q_GADGET而不是Q_OBJECT来启用元对象系统对不是QObject子类的类中的枚举的支持。

每次子类化QObject / QWidget /...:

时,只需使用它
#include <QObject>

class Counter : public QObject
{
    Q_OBJECT

    // ...
}