Russian Qt Forum

Qt => Общие вопросы => Тема начата: QKrot от Апрель 23, 2010, 20:38



Название: Доступ к элементам страницы стэка виджета
Отправлено: QKrot от Апрель 23, 2010, 20:38
Простой код выдаёт простую ошибку
Код
C++ (Qt)
mrScaleWidget* sw = mw.stackedWidget->widget(0);
qDebug() << sw->menuLabel->text();
error: invalid conversion from 'QWidget*' to 'mrScaleWidget*'

При такой конструкции программа при компиляции сразу вылетает
Код
C++ (Qt)
mrScaleWidget* sw = (mrScaleWidget *)mw.stackedWidget->widget(0);
qDebug() << sw->menuLabel->text();

Так вообще правомерно обращаться к атрибутам виджета стэка ? menuLabel -public атрибут. Всё вроде нормально.


Название: Re: Доступ к элементам страницы стэка виджета
Отправлено: alexman от Апрель 23, 2010, 20:42
Вы уверены, что по индексу 0 лежит mrScaleWidget*?


Название: Re: Доступ к элементам страницы стэка виджета
Отправлено: QKrot от Апрель 23, 2010, 20:56
Виджет класса mrScaleWidget я поместил на самую первую страницу стэка. Он унаследован от QWidget. Поэтому я ожидаю, что mw.stackedWidget->widget(0) вернет QWidget-указатель, указывающий на mrScaleWidget как производный класс.


Название: Re: Доступ к элементам страницы стэка виджета
Отправлено: alexman от Апрель 23, 2010, 20:59
Эту функцию использовали int QStackedWidget::addWidget ( QWidget * widget )? Что вернула функция?


Название: Re: Доступ к элементам страницы стэка виджета
Отправлено: Авварон от Апрель 23, 2010, 21:02
а) не юзайте сишый каст
б) для наследников куобжект юзайте qobject_cast
в) напечатайте имя класса/его тип через метаинформацию (если дебаггер не юзаете)


Название: Re: Доступ к элементам страницы стэка виджета
Отправлено: sendevent от Апрель 23, 2010, 21:05
mrScaleWidget* sw = (mrScaleWidget *)mw.stackedWidget->widget(0);
static|qobject_cast прожевывает?
хедер с mrScaleWidget подключен явно?


Название: Re: Доступ к элементам страницы стэка виджета
Отправлено: alexman от Апрель 23, 2010, 21:21
а) не юзайте сишый каст
А в чем проблема?


Название: Re: Доступ к элементам страницы стэка виджета
Отправлено: QKrot от Апрель 23, 2010, 21:40
Очевидно я новичок  :) .
Такой код работает правильно
Код
C++ (Qt)
mrScaleWidget* sw = mw.widget;
qDebug() << sw->menuLabel->text();
widget - имя, которое назначил Designer экземпляру mrScaleWidget.
Однако я не понял, почему на странице стэка разместился объект page типа QWidget, а ниже по иерархии widget класса mrScaleWidget. По идеи page должен быть типа mrScaleWidget. Видимо это результат преобразования QWidget к пользовательскому классу mrScaleWidget.


Название: Re: Доступ к элементам страницы стэка виджета
Отправлено: sendevent от Апрель 23, 2010, 21:45
а) не юзайте сишый каст
А в чем проблема?

сишное приведение сначала все равно попытается использовать static_cast, если не получится - молча сделает reinterpret_cast, да и дело с концом. хотя если не статик_скастилось - стоит задуматься, что хочешь получить и что для этого делаешь.


Название: Re: Доступ к элементам страницы стэка виджета
Отправлено: Авварон от Апрель 23, 2010, 23:58
уишку выложи
по-моему у тебя там лайаут лишний