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, похоже, не знают о наследовании и т.д.: как я могу подклассифицировать виджет, определенный где-то еще, и получить доступ к сигналам виджетов?
У меня есть много примеров того, как использовать инкапсуляцию для выполнения чего-то подобного, но я боюсь, что не понимаю, как это сделать с наследованием.
Извините, если это смешной вопрос - я чувствую, что мне не хватает чего-то очевидного.
Ответы
Ответ 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, или я, возможно, слышал это неправильно, но попробуйте. Кроме того, сигналы являются общедоступными или защищенными, и вы включили соответствующие файлы заголовков?