繁体   English   中英

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

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

我想让一个按钮在点击后保持按下状态。 因此,我制作了一个插槽 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: No such slot QWidget::make_pushed() in" ,尽管一切都编译并出现了窗口。 问题是显然没有找到插槽,尽管它在同一个 cpp 文件和标题中。 因此,当单击时,botton neigher 会更改其文本,也不会保持按下状态。

您只是在类声明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
    
    // ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM