Подтвердить что ты не робот

Qt-сигналы и вопрос наследования

Я относительно новичок в программировании с Qt и задал вопрос. Краткая версия:

Как наследовать сигналы, определенные в суперклассах?

Я пытаюсь подклассифицировать кого-то еще красиво сделанные QTWidgets, чтобы изменить некоторые из поведения по умолчанию:

//Plot3D is a QWidget that defines a signal "rotationChanged"
class matLinePlot : public QObject, public Plot3D {

    Q_OBJECT;
        //etc...
public:
       //etc...

        //Catch Plot3D signal "rotationChanged" and do some magic with it:
    void initPlot(){
              QObject::connect(this, SIGNAL(rotationChanged( double , double , double )),
            this, SLOT(myRotationChanged(double, double, double)));
    }
};

Проблема заключается в строке QObject:: connect. То, что я хотел бы сделать, - подключить rotationChanged SIGNAL (от qwt3D_plot.h) к локальной функции /SLOT - "myRotationChanged". Однако всякий раз, когда я это делаю, во время выполнения я получаю:

Объект:: connect: нет такого сигнала matLinePlot:: rotationChanged (double, double, double)

в C:...\matrixVisualization.h. Конечно, я знаю, что rotationChanged не находится в matrixVisualization.h - он в qwt_plot3D.h, но я думал, что, поскольку я наследую от Plot3D, все должно быть хорошо. Но теперь, когда я думаю об этом, поскольку SIGNAL и SLOT являются макросами, я предполагаю, что MOC не знает/заботится о наследовании.

Что приводит меня к моему вопросу - поскольку MOC и SIGNALS/SLOTS, похоже, не знают о наследовании и т.д.: как я могу подклассифицировать виджет, определенный где-то еще, и получить доступ к сигналам виджетов?

У меня есть много примеров того, как использовать инкапсуляцию для выполнения чего-то подобного, но я боюсь, что не понимаю, как это сделать с наследованием.

Извините, если это смешной вопрос - я чувствую, что мне не хватает чего-то очевидного.

4b9b3361

Ответ 1

Я думаю, проблема заключается в множественном наследовании:

class matLinePlot : public QObject, public Plot3D
...

Я предполагаю, что Plot3D является подклассом QObject? В этом случае вы должны сделать

class matLinePlot : public Plot3D
...

вместо.

Ответ 2

СИГНАЛ (x) и SLOT (x) - это макросы, которые генерируют строковые литералы. Во время выполнения слоты и сигналы сопоставляются с использованием строковых сравнений тех сгенерированных литералов.

(Я бы добавил комментарий к комментарию mdec, но мне не хватает rep)

Ответ 3

Я считаю, что это будет работать, если сигнал Plot3D:: rotationChanged является общедоступным или защищенным. Вы уверены, что сигнал не является приватным?

Edit:

Хотя я не мог найти конкретную ссылку, мне придется заключить, что сигналы всегда открыты. По крайней мере, тест, который я сделал здесь, показало, что я могу подключиться к сигналу, даже если он был объявлен в частной секции класса.

Я также проверил, что сигнал, объявленный в QObject, может быть связан с использованием подкласса QObject в инструкции connect, так что сигналы определенно наследуются. Как я вижу в других ответах и ​​комментариях здесь, проблема должна быть в другом месте.

Ответ 4

Неправильно → см. комментарии.

Я использую Qtopia в Uni, и я считаю, что я вспоминаю, что кто-то говорит что-то о расстоянии в параметрах SIGNAL и SLOT для подключения.

Попробуйте использовать

QObject::connect(this, SIGNAL(rotationChanged(double,double,double)),
            this, SLOT(myRotationChanged(double,double,double)));

Я знаю, что это не кажется интуитивным, поскольку С++ не чувствителен к пробелам, однако я считаю, что он имеет какое-то отношение к некоторой магии, которую использует Qtopia/QT при подключении сигналов и слотов. Это может относиться только к Qtopia, или я, возможно, слышал это неправильно, но попробуйте. Кроме того, сигналы являются общедоступными или защищенными, и вы включили соответствующие файлы заголовков?