我将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
答案 0 :(得分:0)
您遇到以下错误:
如果像所有小部件一样从QObject继承的类将具有信号,插槽等,则必须使用Q_OBJECT宏来创建与那些元素相关的必要实现。因此,如果您在主文件(filename.cpp)中使用Q_OBJECT,则必须包括“ filename.moc”以包括上述内容。
您必须使用新的连接语法,尽管这不是错误,但可能是无声错误的来源。
考虑到上述情况,解决方案是:
main.cpp
#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"