Слоты Qt и наследование: почему моя программа пытается соединиться с родительским, а не с дочерним классом? - PullRequest
7 голосов
/ 01 декабря 2010

В программе Qt у меня есть класс QWidget, который является суперклассом другого класса, объявленного так:

class Renderer : public QGLWidget
{
    Q_OBJECT
    ....
}

class A : public Renderer
{ .... }

Теперь у меня есть слот для класса A, которого нет в Renderer, но когда я пытаюсь запустить программу, она не может установить соединение с классом A:

Object::connect: <sender name: 'push_button'>
Object::connect: <receiver name: 'A'>
Object::connect: No such slot Renderer::loadDialog() in <file path>

Почему он пытается подключиться к Renderer, а не к A? Должен ли я иметь слот в Renderer с таким же именем?

Спасибо

редактирование:

вот объявление слота в A:

public slots:
    void loadDialog();

и что касается соединений, я в основном полагаюсь на Qt Creator, но вот что было в файле ui_windows.h:

QObject::connect(pushButton, SIGNAL(clicked()), A, SLOT(loadDialog()));

Надеюсь, это немного прояснит:)

Ответы [ 2 ]

12 голосов
/ 01 декабря 2010

Можете ли вы показать код, где вы подключаете сигнал и слот?Может быть, было бы также полезно увидеть объявление слота в классе A.

EDIT:

Попробуйте добавить макрос Q_OBJECT в подкласс A. Другое дело, что слот не является виртуальным (носогласно тому, что я прочитал, это не должно иметь никакого значения).

Это всего лишь догадки, код, который вы разместили, выглядит хорошо для меня.У меня нет на этом компьютере Qt, поэтому я не могу попробовать его: (.

3 голосов
/ 01 декабря 2010

Проблема заключается в том, что класс A не имеет объявления Q_OBJECT, поэтому сигналы и слоты с ним не работают.Смотри http://doc.qt.io/qt-5/signalsandslots.html

...