Nash: Qt: слоты у наследника наследника QWidget

5 сообщений / 0 new
Последнее сообщение
Гость
Nash: Qt: слоты у наследника наследника QWidget

Привет всем. Хочу, чтобы мне помогли разобраться в следующем.
Сделал класс-наследник Qwidget, например, xvWidget, добавил в него некоторые методы. Затем сделал класс-наследник от xvWidget, пусть будет videoWidget. В класс videoWidget добавил как свойство таймер и хотел прицепить к нему слот, описанный в videoWidget. Все собралось, но при запуске вывалился ворнинг, мол xvWidget does not have such slot. Тогда сделал так,

connect(Timer, SIGNAL(timeout()), this, SLOT(videoWidget::slotVidTimerTimeout()));

Вывалилось xvWidget::videoWidget does not have such slot. Тогда я объявил этот слот в xvWidget, сделал его чисто виртуальным и реализовал в videoWidget. Все заработало.
Как мне прицепить к таймеру слот из последнего класса и что я делал те так?

<span class='smallblacktext'>[ Редактирование ]</span>

RDron
Аватар пользователя RDron
Не в сети
Зарегистрирован: 20/09/2010

Под словами "добавил как свойство таймер" ты имеешь в виду, что-то подобное:
Q_PROPERTY( QTimer* timer READ timer WRITE setTimer )

Цель у выпущенной стрелы одна – мишень, цель в жизни тоже одна – смерть.

Nash (не проверено)

нет, я имел в виду, что просто добавил в класс переменную QTimer*, без Q_PROPERTY. Хотя думаю, что суть вопроса это не меняет

RDron
Аватар пользователя RDron
Не в сети
Зарегистрирован: 20/09/2010

Нет суть вопроса это как раз меняет кардинально.
Если просто переменную, то вот тебе пример кода:

// main.cpp

#include QApplication
#include "class_file.h"

int main( int argc, char *argv[] )
{
QApplication app( argc, argv );

videoWidget *wid = new videoWidget();
wid->show();

return app.exec();
}

// class_file.h

#include QWidget
#include QTimer

class xvWidget: public QWidget
{
Q_OBJECT

public:
xvWidget( QWidget *parent = 0 );
};

class videoWidget: public xvWidget
{
Q_OBJECT

public:
videoWidget( QWidget *parent = 0 );

public slots:
void slotVidTimerTimeout();

private:
QTimer *Timer;
};

// class_file.cpp

#include iostream
#include "class_file.h"

xvWidget::xvWidget( QWidget *parent ) : QWidget( parent )
{
std::cout << "xvWidget" << std::endl;
}

videoWidget::videoWidget( QWidget *parent ) : xvWidget( parent )
{
std::cout << "videoWidget" << std::endl;

Timer = new QTimer( this );
Timer->setInterval( 1000 );

connect( Timer, SIGNAL(timeout()),
this, SLOT(slotVidTimerTimeout()) );

Timer->start();
}

void videoWidget::slotVidTimerTimeout()
{
std::cout << "Time Out!" << std::endl;
}

У меня всё работает, после запуска в консоль раз в секунду идёт сообщение.

Примечание: скобки в описании инклудов удалил скрипт форума... а выделить текст с помощью code не получается в виду неработоспособности этой функции.
<span class='smallblacktext'>[ Редактирование 26.02.2009 - 10:05:22 ]</span>

Цель у выпущенной стрелы одна – мишень, цель в жизни тоже одна – смерть.

Nash (не проверено)

Всё, разобрался)))
Кому интересно, то я в объявлении класса videoWidget не указал макрос Q_OBJECT. Даже если этот класс является наследником класса с указанным Q_OBJECT, все равно его нужно указать согласно спарвке:
"The Q_OBJECT macro must appear in the private section of a class definition that declares its own signals and slots".
Я почему-то думал, что достаточно только в родительском указать.

RDron, спасибо

RSS-материал