我想制作一个按钮,在点击后保持按下状态。所以我创建了一个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文件和标头中。因此,当点击时,按钮更改其文本也不会被推动。
答案 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
// ...
}