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

QObject::sender() doesn't work properly in a slot

本文关键字:常工作 工作 插槽 sender QObject      更新时间:2023-10-16

我想做一个按钮,在点击后保持按下状态。所以我做了一个插槽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();
 };

应用程序输出"QObject::connect:没有这样的插槽QWidget::make_pushed()"中存在错误,尽管所有内容都已编译并出现窗口。问题是显然找不到插槽,尽管它位于相同的 cpp 文件和标头中。因此,当单击时,botton neigher 会更改其文本或保持推送状态。

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

请注意,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
    
    // ...
}