Qt не будет подключаться к слоту в подклассе - PullRequest
0 голосов
/ 01 декабря 2019

Я вложил в подкласс QTabWidget и добавил новый публичный слот. Когда я пытаюсь подключиться к этому слоту, Qt говорит мне, что моего слота не существует. Но, похоже, смотрит в родительский класс. Чего мне не хватает?

Вот минимальная программа, которая воспроизводит проблему. Я запускаю его в Qt 5.13 с 32-битным пакетом MinGW.

#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 (), это указатель на подкласс, верно? Так зачем искать слот в суперклассе?

QObject::connect: No such slot QTabWidget::changeTabName(int) in main.cpp:14
QObject::connect:  (sender name:   'qt_tabwidget_tabbar')
connect() returns  false

1 Ответ

0 голосов
/ 01 декабря 2019

У вас есть следующие ошибки:

  • Если класс, который наследуется от QObject, как и все виджеты, будет иметь сигналы, слоты и т. Д., То для создания макроса Q_OBJECT необходимо использоватьнеобходимые реализации, связанные с этими элементами. Поэтому, если вы используете Q_OBJECT в основном файле (filename.cpp), вы должны включить «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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...