Russian Qt Forum
Ноябрь 26, 2024, 10:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: qobject_cast то работает то нет...  (Прочитано 23762 раз)
Krow
Гость
« : Октябрь 10, 2009, 13:13 »

Код:
qobject_cast<mainWindow *>(parent()->parent()->parent())->ui.actNumberSklad->text();
вот этот код вылетает с ошибкой..
Код:
qobject_cast<mainWindow *>(parent()->parent()->parent())->ui.actTovCat;
а вот этот нормально работает...
эти коды размещены в разных исходниках.
и хз почему ине работает... инклуд mainWindow.h прописан и там и там... уже третий день голову ломаю, не могу понять какого это не работает. требуется стороннее мнение где я дурак?
Записан
spirit
Гость
« Ответ #1 : Октябрь 10, 2009, 13:37 »

валидность указателя каждого парента и самого actTovCat. что-то не так с указателями (нулевой или невалидный).
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Октябрь 10, 2009, 14:00 »

вместо написания длинной строки лучше писать в несколько, тогда и проверить можно, произошло приведение типа или нет:
Код
C++ (Qt)
mainWindow *w = qobject_cast<mainWindow *>(parent()->parent()->parent());
if (w){
   w->ui.actNumberSklad->text();
}else{
   qDebug() << "Kemuto herovato";
}
 
« Последнее редактирование: Октябрь 10, 2009, 14:01 от lit-uriy » Записан

Юра.
Krow
Гость
« Ответ #3 : Октябрь 10, 2009, 15:32 »

Код:
	mainWindow *w = qobject_cast<mainWindow *>(parent()->parent()->parent());
if (w)
{
dirCount = w->ui.actNumberSklad->text();
}
else
{
QMessageBox::information(0, "", "Khernya kakaya-to");
}
один фиг спотыкается на первой строчке... если ставлю всего один парент тогда выскакивает сообщение что это всё фигня... иначе просто отваливается в дебаггер и всё...
Записан
Krow
Гость
« Ответ #4 : Октябрь 10, 2009, 16:15 »

Код:
fMyOrg *child = new fMyOrg;
child->dirCount = dirCount;
сделал так при вызове из mainWindow. теперь работает всё как надо.
но всё же интересно почему оно там спотыкалось!
Записан
SASA
Гость
« Ответ #5 : Октябрь 10, 2009, 16:59 »

ИХМО если у вас появляются структуры вида parent()->parent()->parent(), то либо рядом должно быть много проверок и комментариев, либо надо менять архитектуру.
Записан
BRE
Гость
« Ответ #6 : Октябрь 10, 2009, 17:20 »

либо рядом должно быть много проверок и комментариев
А в комментариях лучше написать: "FixMe: Сегодня мне было особенно плохо..."  Подмигивающий

либо надо менять архитектуру.
+1. Нужно сразу начать менять.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Октябрь 10, 2009, 17:30 »

Присоединяюсь, конструкция parent()->parent()->parent() ненадежна и будет разваливаться при каждом добавлении лайаута. Про "архитектуру" громко сказано, можно нормально сделать за 5 минут

http://www.prog.org.ru/topic_10751_0.html
Записан
BRE
Гость
« Ответ #8 : Октябрь 10, 2009, 17:38 »

Про "архитектуру" громко сказано, можно нормально сделать за 5 минут
Да костылек можно быстренько подставить, вопросов нет.
Только если необходимо из внутренних виджетов добираться до mainWindow, то скорее всего что то не то с архитектурой классов и их связями. Дочерние классы получаются зависимыми от класса mainWindow, они должны о нем знать и уметь им пользоваться. Что не есть гуд, для повторного использования кода.
По мне уж лучше связывание через connect сделать...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Октябрь 10, 2009, 17:52 »

Только если необходимо из внутренних виджетов добираться до mainWindow, то скорее всего что то не то с архитектурой классов и их связями. Дочерние классы получаются зависимыми от класса mainWindow, они должны о нем знать и уметь им пользоваться. Что не есть гуд, для повторного использования кода.
По мне уж лучше связывание через connect сделать...
Согласен что connect лучше/техничнее, но проблем с архитектурой это не решает. Все равно "кто-то" (кто связывает слот/сигнал) должен "знать все" о mainWindow и его child - зависимость все равно остается прямой/явной. Ну и до повторного использования еще дожить надо Улыбающийся
Записан
BRE
Гость
« Ответ #10 : Октябрь 10, 2009, 17:58 »

Согласен что connect лучше/техничнее, но проблем с архитектурой это не решает. Все равно "кто-то" (кто связывает слот/сигнал) должен "знать все" о mainWindow и его child - зависимость все равно остается прямой/явной. Ну и до повторного использования еще дожить надо Улыбающийся
Сделать mainWindow универсальным вряд ли получится, поэтому пытаемся делать child'ы отвязанными от лишних связей. Пусть mainWindow этим занимается, он и так все знает о себе и своих детях. Все связи будут в одном месте.
А когда делаешь какой нибудь ComboBox, который жестко привязан к какой то переменной в каком то классе, то его больше нигде использовать не получиться. Так зачем он такой нужен.  Подмигивающий
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Октябрь 10, 2009, 18:16 »

Сделать mainWindow универсальным вряд ли получится, поэтому пытаемся делать child'ы отвязанными от лишних связей. Пусть mainWindow этим занимается, он и так все знает о себе и своих детях. Все связи будут в одном месте.
А когда делаешь какой нибудь ComboBox, который жестко привязан к какой то переменной в каком то классе, то его больше нигде использовать не получиться. Так зачем он такой нужен.  Подмигивающий
Все верно, не должен child переться в parent (и особенно вызывать методы parent напрямую). Но что делать если ему от parent'а нужно что-то получить чтобы продолжить свою работу? И это "что-то" по смыслу в  parent. Иногда удается удачно положить, иногда интерфейсная прокладка подойдет, ну а иногда проще признаться - это глухо конкретно и ни на какую общность мы не рассчитываем Улыбающийся
Записан
BRE
Гость
« Ответ #12 : Октябрь 10, 2009, 18:20 »

Все верно, не должен child переться в parent (и особенно вызывать методы parent напрямую). Но что делать если ему от parent'а нужно что-то получить чтобы продолжить свою работу? И это "что-то" по смыслу в  parent. Иногда удается удачно положить, иногда интерфейсная прокладка подойдет, ну а иногда проще признаться - это глухо конкретно и ни на какую общность мы не рассчитываем Улыбающийся
Код
C++ (Qt)
mainWindow::mainWindow(...)
{
m_setupWidget = new SetupWidget( this );
connect( m_setupWidget, SIGNAL( changedParameter1( int ) ), SLOT( setData( int ) ) );
connect( m_setupWidget, SIGNAL( changedParameter2( const QString & ) ), SLOT( setText( const QString & ) ) );
}
 
Мысль понятна?  Подмигивающий
А кто, что и в какой вложенности будет менять в SetupWidget дело десятое. Пусть сам SetupWidget будет сообщать о изменениях. И mainWindow не нужно ничего знать про внутренности setupWidget.
Мы можем что угодно менять в SetupWidget, пока будет не изменен интерфейс mainWindow сможет с ним работать.
« Последнее редактирование: Октябрь 10, 2009, 18:26 от BRE » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Октябрь 10, 2009, 18:49 »

Мысль понятна?  Подмигивающий
А кто, что и в какой вложенности будет менять в SetupWidget дело десятое. Пусть сам SetupWidget будет сообщать о изменениях. И mainWindow не нужно ничего знать про внутренности setupWidget.
Мы можем что угодно менять в SetupWidget, пока будет не изменен интерфейс mainWindow сможет с ним работать.
На простых примерах отлично проходит все что угодно Улыбающийся А если, например

Код:
struct Settings {
  double mRatio;
  ...
};

void SetupWidget::DoSomething( void )
{
  int mode = GetCurrentMode();
  ...
  if (useSettings) {
   Settings theS;
   MainWindow::Instance()->BuildSettings(&theS, mode);
   if (theS.mRatio != 1.0) {
    ...
   }
  }
}
Хорошо бы подать, например, указатель на Settings в SetupWidget, но не выходит - нужен метод а не данные. BuildSettings должно знать много всего и место ей вроде в MainWindow. Мы можем послать сигнал вместо Instance() - да, но что это в принципе меняет?
Записан
BRE
Гость
« Ответ #14 : Октябрь 10, 2009, 18:55 »

BuildSettings должно знать много всего и место ей вроде в MainWindow.
Действительно? BuildSettings должно находиться в ГЛАВНОМ ОКНЕ программы? Хм...  Шокированный
Ты правда так думаешь? А может для setting лучше сделать отдельную сущность, к которой будет доступ и у mainWindow и у SetupWidget?
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.096 секунд. Запросов: 23.