[英]Qt won't connect to a slot in a subclass
我已經繼承了 QTabWidget 並添加了一個新的公共插槽。 當我嘗試連接到該插槽時,Qt 告訴我我的插槽不存在。 但似乎正在尋找父類。 我錯過了什么?
這是一個重現問題的最小程序。 我在 Qt 5.13 中使用 MinGW 32 位包運行它。
#include <QMainWindow>
#include <QApplication>
#include <QTabWidget>
#include <QTabBar>
#include <QDebug>
class MyTabWidget : public QTabWidget
{
public:
MyTabWidget(QWidget *parent) : QTabWidget(parent)
{
qDebug() << "connect() returns " <<
connect(this->tabBar(),SIGNAL(tabBarDoubleClicked(int)),this,SLOT(changeTabName(int)));
}
public slots:
void changeTabName(int index)
{
tabBar()->setTabText(index,"New Name");
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow *mw = new QMainWindow();
QWidget *tw;
MyTabWidget *t = new MyTabWidget(mw);
tw = new QWidget(mw);
t->addTab(tw,"Double-click This Tab");
mw->setCentralWidget(t);
mw->show();
return a.exec();
}
這是輸出。 當 connect() 被調用時,“this”是一個指向子類的指針,對嗎? 那么它為什么要在超類中尋找插槽呢?
QObject::connect: No such slot QTabWidget::changeTabName(int) in main.cpp:14
QObject::connect: (sender name: 'qt_tabwidget_tabbar')
connect() returns false
您有以下錯誤:
如果像所有小部件一樣從 QObject 繼承的類將具有信號、槽等,那么您必須使用 Q_OBJECT 宏來創建與這些元素關聯的必要實現。 因此,如果您在主文件 (filename.cpp) 中使用 Q_OBJECT,那么您必須包含“filename.moc”以包含上述內容。
您必須使用新的連接語法,雖然它不是錯誤但可能是靜默錯誤的來源。
綜上所述,解決方法是:
主程序
#include <QMainWindow>
#include <QApplication>
#include <QTabWidget>
#include <QTabBar>
#include <QDebug>
class MyTabWidget : public QTabWidget
{
Q_OBJECT
public:
MyTabWidget(QWidget *parent) : QTabWidget(parent)
{
qDebug() << "connect() returns " <<
connect(tabBar(), &QTabBar::tabBarDoubleClicked, this, &MyTabWidget::changeTabName);
}
public slots:
void changeTabName(int index)
{
tabBar()->setTabText(index,"New Name");
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow *mw = new QMainWindow();
QWidget *tw;
MyTabWidget *t = new MyTabWidget(mw);
tw = new QWidget(mw);
t->addTab(tw,"Double-click This Tab");
mw->setCentralWidget(t);
mw->show();
return a.exec();
}
#include "main.moc"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.