Russian Qt Forum

Qt => Общие вопросы => Тема начата: Krow от Октябрь 10, 2009, 13:13



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


Название: Re: qobject_cast то работает то нет...
Отправлено: spirit от Октябрь 10, 2009, 13:37
валидность указателя каждого парента и самого actTovCat. что-то не так с указателями (нулевой или невалидный).


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


Название: Re: qobject_cast то работает то нет...
Отправлено: Krow от Октябрь 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");
}
один фиг спотыкается на первой строчке... если ставлю всего один парент тогда выскакивает сообщение что это всё фигня... иначе просто отваливается в дебаггер и всё...


Название: Re: qobject_cast то работает то нет...
Отправлено: Krow от Октябрь 10, 2009, 16:15
Код:
fMyOrg *child = new fMyOrg;
child->dirCount = dirCount;
сделал так при вызове из mainWindow. теперь работает всё как надо.
но всё же интересно почему оно там спотыкалось!


Название: Re: qobject_cast то работает то нет...
Отправлено: SASA от Октябрь 10, 2009, 16:59
ИХМО если у вас появляются структуры вида parent()->parent()->parent(), то либо рядом должно быть много проверок и комментариев, либо надо менять архитектуру.


Название: Re: qobject_cast то работает то нет...
Отправлено: BRE от Октябрь 10, 2009, 17:20
либо рядом должно быть много проверок и комментариев
А в комментариях лучше написать: "FixMe: Сегодня мне было особенно плохо..."  ;)

либо надо менять архитектуру.
+1. Нужно сразу начать менять.


Название: Re: qobject_cast то работает то нет...
Отправлено: Igors от Октябрь 10, 2009, 17:30
Присоединяюсь, конструкция parent()->parent()->parent() ненадежна и будет разваливаться при каждом добавлении лайаута. Про "архитектуру" громко сказано, можно нормально сделать за 5 минут

http://www.prog.org.ru/topic_10751_0.html


Название: Re: qobject_cast то работает то нет...
Отправлено: BRE от Октябрь 10, 2009, 17:38
Про "архитектуру" громко сказано, можно нормально сделать за 5 минут
Да костылек можно быстренько подставить, вопросов нет.
Только если необходимо из внутренних виджетов добираться до mainWindow, то скорее всего что то не то с архитектурой классов и их связями. Дочерние классы получаются зависимыми от класса mainWindow, они должны о нем знать и уметь им пользоваться. Что не есть гуд, для повторного использования кода.
По мне уж лучше связывание через connect сделать...


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


Название: Re: qobject_cast то работает то нет...
Отправлено: BRE от Октябрь 10, 2009, 17:58
Согласен что connect лучше/техничнее, но проблем с архитектурой это не решает. Все равно "кто-то" (кто связывает слот/сигнал) должен "знать все" о mainWindow и его child - зависимость все равно остается прямой/явной. Ну и до повторного использования еще дожить надо :)
Сделать mainWindow универсальным вряд ли получится, поэтому пытаемся делать child'ы отвязанными от лишних связей. Пусть mainWindow этим занимается, он и так все знает о себе и своих детях. Все связи будут в одном месте.
А когда делаешь какой нибудь ComboBox, который жестко привязан к какой то переменной в каком то классе, то его больше нигде использовать не получиться. Так зачем он такой нужен.  ;)


Название: Re: qobject_cast то работает то нет...
Отправлено: Igors от Октябрь 10, 2009, 18:16
Сделать mainWindow универсальным вряд ли получится, поэтому пытаемся делать child'ы отвязанными от лишних связей. Пусть mainWindow этим занимается, он и так все знает о себе и своих детях. Все связи будут в одном месте.
А когда делаешь какой нибудь ComboBox, который жестко привязан к какой то переменной в каком то классе, то его больше нигде использовать не получиться. Так зачем он такой нужен.  ;)
Все верно, не должен child переться в parent (и особенно вызывать методы parent напрямую). Но что делать если ему от parent'а нужно что-то получить чтобы продолжить свою работу? И это "что-то" по смыслу в  parent. Иногда удается удачно положить, иногда интерфейсная прокладка подойдет, ну а иногда проще признаться - это глухо конкретно и ни на какую общность мы не рассчитываем :)


Название: Re: qobject_cast то работает то нет...
Отправлено: BRE от Октябрь 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 сможет с ним работать.


Название: Re: qobject_cast то работает то нет...
Отправлено: Igors от Октябрь 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() - да, но что это в принципе меняет?


Название: Re: qobject_cast то работает то нет...
Отправлено: BRE от Октябрь 10, 2009, 18:55
BuildSettings должно знать много всего и место ей вроде в MainWindow.
Действительно? BuildSettings должно находиться в ГЛАВНОМ ОКНЕ программы? Хм...  :o
Ты правда так думаешь? А может для setting лучше сделать отдельную сущность, к которой будет доступ и у mainWindow и у SetupWidget?


Название: Re: qobject_cast то работает то нет...
Отправлено: Igors от Октябрь 10, 2009, 19:08
Действительно? BuildSettings должно находиться в ГЛАВНОМ ОКНЕ программы? Хм...  :o
Ты правда так думаешь?
В окне или нет, но очень может быть что в классе который намного мощнее SetupWidget.

А может для setting лучше сделать отдельную сущность, к которой будет доступ и у mainWindow и у SetupWidget?
Ну сама Setting на "сущность" не очень тянет - пассивные данные, struct. Здесь по-моему хорошо подойдет "implementation" техника (немногое что мне понравилось в Жабе). После тщательного обдумывания конечно.

Так что я бы человека за "архитектуру" не осуждал, это может быть очень непросто и иногда лучше "поступиться принципами" :)


Название: Re: qobject_cast то работает то нет...
Отправлено: BRE от Октябрь 10, 2009, 19:16
это может быть очень непросто и иногда лучше "поступиться принципами" :)
По моему, это девиз Microsoft.  ;)

[off]
IMHO
При ООП нельзя сесть за компьютер, открыть ТЗ и как пианист начать строчить что вижу. Для ООП больше подходит процесс длительного проектирования, которое потом выльется в более компактный и эффективный код, с большим количеством повторного использования кода. Нужно выделять сущности, продумывать их взаимодействие (интерфейсы). А иначе, процесс будет превращаться, чем "дальше в лес" тем "больше костылей".
[/off]


Название: Re: qobject_cast то работает то нет...
Отправлено: Rcus от Октябрь 10, 2009, 19:30
Точно, а то что рефакторинг зародился в среде программистов SmallTalk это совпадение ага :)
Начинали с qobject_cast, а пришли к Waterfall vs Agile :)


Название: Re: qobject_cast то работает то нет...
Отправлено: BRE от Октябрь 10, 2009, 20:08
Точно, а то что рефакторинг зародился в среде программистов SmallTalk это совпадение ага :)
Ты имеешь ввиду рефакторинг кода во время разработки?
При эволюции системы он скорее всего понадобиться. Но...
Если в системе есть датчик, то нужно описать сущность датчик, которая не должна ничего знать о главном окне, о базе данных, куда все показания должны сохраняться и о подобных сущностях. Если в какой то момент разработки из класса датчика нужно вытащить работу с железом и поместить ее в другую сущность "железо", с которой в дальнейшем будет работать датчик, то в этом нет ничего плохого, остальная часть системы как работала с датчиком так и будет работать. Если меняется интерфейс для работы датчиком, то эти изменения коснутся только сущностей, которые на прямую работают с ним. А при правильной архитектуре это будут далеко не все классы системы.
Сейчас же сплошь и рядом пишут комбобоксы, которые напрямую лезут к железу, таблицы которые напрямую работают с базами данных и т.д. А когда просишь людей уберите этот GUI и прицепите ncurses, т.к. на машине которая будет стоять рядом с прибором (для мониторинга) не установлены X, они широко раскрывают глаза и удивленно отвечают, что у нас весь функционал размазан по GUI и одно без другого не работает. Становиться грустно.
Поэтому, я убежден, что при разработке новой системы проектированию необходимо уделять максимум времени, что бы потом использовать минимум костылей.  :)


Название: Re: qobject_cast то работает то нет...
Отправлено: Igors от Октябрь 10, 2009, 20:34
что бы потом использовать минимум костылей.  :)
Ага, значит наличие и необходимость костылей Вы все-таки признаете :) Вы описали классический случай "сделайте версию application с командной строкой без UI" - это всегда хорошая проверка архитектуры на вшивость. Но я не могу согласиться с Вами что все будут (и должны) делать это пока жизнь не заставит. Планировать перед стартом конечно нужно, но никогда всего не предусмотришь, хорошие, гибкие зависимости обычно получаются со второго-третьего раза. Возвращаясь к qobject_cast: очень может быть что "костыля" с взятием указателя MainWidow хватит на несколько лет и никаких проблем не возникнет - например если человек пишет серию плагинов. Зачем же грузить его замысловатой конструкцией с множественным наследованием, чистыми виртуалами и.т.п., что (по моему мнению) правильно и корректно но ... нужно ли оно ему?

Ну вот, мы с Вами опять свалились во флуд, умолкаю :)


Название: Re: qobject_cast то работает то нет...
Отправлено: BRE от Октябрь 10, 2009, 20:54
Вы описали классический случай "сделайте версию application с командной строкой без UI" - это всегда хорошая проверка архитектуры на вшивость.
Не обязательно с командной строкой. Главное, что бы функционал был отделен от GUI, тогда к нему можно и командную строку приделать и Qt/wxWidget/Gtk...
Если абстракцию можно выделить в сущность, то ее нужно выделить. Не нужно все что можно пихать в MainWindow, он должен отвечать только за главное окно, включая меню, тулбар и т.д. Также комбобокс должен уметь только вывести список строк и просигнализировать о том какую строку выбрал пользователь, больше он ничего не должен уметь делать!

Ну вот, мы с Вами опять свалились во флуд, умолкаю :)
Лучше на ты.
С флудом согласен, тоже умолкаю.  :)


Название: Re: qobject_cast то работает то нет...
Отправлено: Krow от Октябрь 11, 2009, 09:42
мужики, отсыпьте а?! я тоже так хочу.. :)

развели беседу на тему сущностей и прочей нечисти. аы совсем забыли про то что не каждый программист, а если точнее никакой программист с нуля нифига не знает, он этому всему на практике учится, вспомните учебники по программированию, вы ведь никогда не прочтете главы по работе с БД если не будете знать азов языка! и тут тоже нужно допускать момент что пока мы что то пишем, мы делаем по своему, а в будущем узнаем что то же что мы делали можно делать проще... и что? переделывать кординально код, или писать заново большую прогу? нет я понимаю если есть разделение труда.. обмен опытом постоянный в пределах допустим офиса.. а если такого нет?! вот то-то и оно!
изначально моя прога работала по одному, и когда узнаю что что-то можно делать проще, то уже новые модули работают так чтобы проге  было лучше и меньше "костылей" было. а уже существующие модули они в процессе их доработки переделываются...

но вернёмся к заданному вопросу! суть была такова, во вновь созданный класс передаются некоторые переменные которые известны классу mainWindow. вот и был вопрос, как достать их из mainWindow в child.. сначала делал это с помощью парентов, а потом уже переменные стал при инициализации child'a передавать..
создавать отдельную сущность для хранения переменных не хочу. оно пока не требуется в этой программе.
да и всё же был вопрос в том почему не работает qobject_cast. ведь последовательность парентов что в этом классе (не работает каст) что в другом (в котором работает) одинакова!
при чем я писал раньше, инклуды у обоих чайлдов одинаковы..


Название: Re: qobject_cast то работает то нет...
Отправлено: BRE от Октябрь 11, 2009, 11:19
мужики, отсыпьте а?! я тоже так хочу.. :)
Вчера все закончилось.  :)

и что? переделывать кординально код, или писать заново большую прогу?
Вот и может получиться, что в какой то момент времени придется все переписывать заново.

изначально моя прога работала по одному, и когда узнаю что что-то можно делать проще, то уже новые модули работают так чтобы проге  было лучше и меньше "костылей" было. а уже существующие модули они в процессе их доработки переделываются...
Вот сейчас самое время начать переделывать, такие цепочки парентов как раз об этом говорят.

но вернёмся к заданному вопросу! суть была такова, во вновь созданный класс передаются некоторые переменные которые известны классу mainWindow. вот и был вопрос, как достать их из mainWindow в child.. сначала делал это с помощью парентов, а потом уже переменные стал при инициализации child'a передавать..
Если переменные из mainWindow являются константами для child - передавай их при конструировании child, если в процессе работы эти переменные могут меняться и об этом изменении должен узнавать child сделай связь через сигналы. Тогда ты избавишься от жестких связей между объектами mainWindow и child.

да и всё же был вопрос в том почему не работает qobject_cast. ведь последовательность парентов что в этом классе (не работает каст) что в другом (в котором работает) одинакова!
при чем я писал раньше, инклуды у обоих чайлдов одинаковы..
Попробуй посмотреть, что возвращает каждый из parent() в твоих случаях.
Код
C++ (Qt)
QObject *parent1 = parent();
Q_ASSERT( parent1 );
qDebug() << parent1;
 
QObject *parent2 = parent1->parent();
Q_ASSERT( parent2 );
qDebug() << parent2;
 
QObject *parent3 = parent2->parent();
Q_ASSERT( parent3 );
qDebug() << parent3;
 


Название: Re: qobject_cast то работает то нет...
Отправлено: Krow от Октябрь 11, 2009, 11:40
ну так в данный момент отчасти прогу и переделываю.. ибо столкнулся с тем что нужно вести теперь не только локальный склад, но и контроллировать несколько различных складов из одной программы.
ды, вопрос конечно не совсем по разделу но всё же, чтобы не открывать новую тему. можите написать пример как правильно инициализировать транзации в БД? и как можно убить  созданный экземпляр QSqlQuery (я чего то забыл как это делается)
ЗЫ ну а мож найдётся сегодня к вечеру чего отсыпать? а то очень на ночь надо, пиво уже нре помогатет.


Название: Re: qobject_cast то работает то нет...
Отправлено: BRE от Октябрь 11, 2009, 11:58
ды, вопрос конечно не совсем по разделу но всё же, чтобы не открывать новую тему. можите написать пример как правильно инициализировать транзации в БД?
bool QSqlDriver::hasFeature ( DriverFeature feature ) const + QSqlDriver::Transactions
bool QSqlDatabase::transaction ()
bool QSqlDatabase::commit ()
bool QSqlDatabase::rollback ()

и как можно убить  созданный экземпляр QSqlQuery (я чего то забыл как это делается)
Код
C++ (Qt)
// Убьется сам
{
QSqlQuery q;
...
}
 
// Убъем руками
{
QSqlQuery *q = new QSqlQuery;
...
delete q;
}
 


Название: Re: qobject_cast то работает то нет...
Отправлено: Krow от Октябрь 11, 2009, 12:18
bool QSqlDriver::hasFeature ( DriverFeature feature ) const + QSqlDriver::Transactions
bool QSqlDatabase::transaction ()
bool QSqlDatabase::commit ()
bool QSqlDatabase::rollback ()
а правильно вызывать как? опять же сори просто с ними ещё не сталкивался..  и есть ли в этом механизме проверка успешна ли транзакция или нет..
Код
C++ (Qt)
// Убьется сам
{
QSqlQuery q;
...
}
 
// Убъем руками
{
QSqlQuery *q = new QSqlQuery;
...
delete q;
}
 
ага, пасиб. так и думал, но на всякий случай переспросил..
delete я так понимаю любой объект убивает?


Название: Re: qobject_cast то работает то нет...
Отправлено: BRE от Октябрь 11, 2009, 12:32
а правильно вызывать как? опять же сори просто с ними ещё не сталкивался..
Посмотри в assisten документацию по модулю QtSql. Так есть раздел Transactions с примером использования.
В общих чертах:
* Начинаешь транзакцию QSqlDatabase::database().transaction()
* Выполняешь запросы
* Если произошла ошибка, то вызываешь QSqlDatabase::database().rollback(), которая откатит все до состояния перед началом транзакции.
* Иначе (все хорошо) фиксируешь все в базе QSqlDatabase::database().commit()

и есть ли в этом механизме проверка успешна ли транзакция или нет..
Так эти функции все результат возвращают.


Название: Re: qobject_cast то работает то нет...
Отправлено: Krow от Октябрь 11, 2009, 12:48
пасиб попытась.. сегодня-завтра помедитирую на эту тему..
будут вопросы отпишусь.. ну или результаты на будущее, может кому пригодятся.


Название: Re: qobject_cast то работает то нет...
Отправлено: Krow от Октябрь 11, 2009, 21:31
так... теперь снова по теме которую создавал.. ситуация обратная.. нужно чтобы из чайлда передать переменную в mainWindow.. кто-то там говорил на счёт сигналов и слотов? а поподробнее можно как это отслеживать? вызов через:
Код:
object_cast<mainWindow *>(parent()->parent()->parent())->ui.actNumberSklad->setText(dirCount);
вообще нифига не даёт.. просто тихое молчание без вылезаний в qDebug()


Название: Re: qobject_cast то работает то нет...
Отправлено: Igors от Октябрь 11, 2009, 21:37
так... теперь снова по теме которую создавал.. ситуация обратная.. нужно чтобы из чайлда передать переменную в mainWindow.. кто-то там говорил на счёт сигналов и слотов? а поподробнее можно как это отслеживать? вызов через:
Код:
object_cast<mainWindow *>(parent()->parent()->parent())->ui.actNumberSklad->setText(dirCount);
вообще нифига не даёт.. просто тихое молчание без вылезаний в qDebug()
Уберите порнуху (parent()->parent()->parent()) - тогда и поговорим


Название: Re: qobject_cast то работает то нет...
Отправлено: Krow от Октябрь 11, 2009, 21:46
давайте... порнуху убрать не сложно.. а что вместо неё класть туда? 0_о


Название: Re: qobject_cast то работает то нет...
Отправлено: Igors от Октябрь 11, 2009, 22:21
давайте... порнуху убрать не сложно.. а что вместо неё класть туда? 0_о
То, что было написано в этой теме :)


Название: Re: qobject_cast то работает то нет...
Отправлено: Krow от Октябрь 12, 2009, 08:31
читал что написанор в теме, если честно то ниасилил... либо мне нужно точно так же покурить что и люди мне писавшие здесь.. или всё же пояснить страждущему до знаний поконкретнее было написано..


Название: Re: qobject_cast то работает то нет...
Отправлено: BRE от Октябрь 12, 2009, 09:30
читал что написанор в теме, если честно то ниасилил... либо мне нужно точно так же покурить что и люди мне писавшие здесь.. или всё же пояснить страждущему до знаний поконкретнее было написано..
Да ладно, это фундаментальный механизм Qt: Signals & Slots. Разберись с ним.  ;)

Код
C++ (Qt)
class Child : public QWidget
{
Q_OBJECT
public:
...
signals:
void changedString( const QString &str );
};
 
class mainWindow : ...
{
mainWindow(...)
{
ui.setupUi( this );
 
m_child = new Child( this );
connect( m_child, SIGNAL( changedString( const QString & ) ), ui.actNumberSklad, SLOT( setText( const QString & ) ) );
}
};
 
Когда изменяется строка в child нужно испустить сигнал emit changedString( tr( "Измененная строка" ) ) и все слоты подключенные к этому сигналу получат измененную строку.


Название: Re: qobject_cast то работает то нет...
Отправлено: Krow от Октябрь 12, 2009, 09:39
тьфу блин.. совсем забыл что можно самому сигналы создавать...
пасиб что напомнил!


Название: Re: qobject_cast то работает то нет...
Отправлено: Krow от Октябрь 12, 2009, 14:42
итак.. продолжаем обучать меня неразумного... сделал так..
child
.h
Код:
signals:
void changedString( const QString &str );
.cpp - вызвал в той процедуре где мне нужен этот сигнал
Код:
emit changedString(dirCount);
mainWindow
.h
Код:
private slots:
void setDirCount(const QString &str );
.cpp
Код:
void mainWindow::setDirCount(const QString &str)
{
dirCount = str;
ui.actNumberSklad->setText(dirCount);
}
место где делаю коннект сигнала
   
Код:
fMyOrg *child = new fMyOrg;
connect (child, SIGNAL(changedString( const QString & )), this, SLOT(setDirCount( const QString & )));
child->dirCount = dirCount;
нифига не пашет... у меня не студия, поэтому консоль ничего не выдаёт по наличию или отсутствию коннекта с сигналом..
как это проверить? и вообще почему может не работать
ЗЫ можно быть дураком даже если умный... но хочется как можно меньше в себе оставить эту часть от дурака..


Название: Re: qobject_cast то работает то нет...
Отправлено: pastor от Октябрь 12, 2009, 15:01
Про Q_OBJECT незабыл?


Название: Re: qobject_cast то работает то нет...
Отправлено: Krow от Октябрь 12, 2009, 16:32
не забыл..
у меня ведь до этого были сигланы и слоты.. и они коннектятся нормально..
а этот почему то не хочет...
вообще есть проверка на то есть сигнал или нет?? точнее есть соединение сигнал\слот или нет..?


Название: Re: qobject_cast то работает то нет...
Отправлено: uriel от Октябрь 12, 2009, 17:13
Если нет консоли, а нужно прочитать сообщение об ошибке, то можно немного извернуться.
Код
C++ (Qt)
void customMessageHandler(QtMsgType, const char *msg){
QMessageBox::critical(0, '', QString::fromAscii(msg));
}
 
int main(int argc, char *argv[])
{
...
qInstallMsgHandler(customMessageHandler);
...
}


Название: Re: qobject_cast то работает то нет...
Отправлено: pastor от Октябрь 12, 2009, 17:52
вообще есть проверка на то есть сигнал или нет?? точнее есть соединение сигнал\слот или нет..?

Цитировать
bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection )   [static]
Creates a connection of the given type from the signal in the sender object to the method in the receiver object. Returns true if the connection succeeds; otherwise returns false.


Название: Re: qobject_cast то работает то нет...
Отправлено: Krow от Октябрь 12, 2009, 21:21
пасибо, завтра попробую и отпишусь о результате.


Название: Re: qobject_cast то работает то нет...
Отправлено: Krow от Октябрь 13, 2009, 12:19
странно, сигнал нормально соединяется... а вот слот не пашет... точнее не вызывается..


Название: Re: qobject_cast то работает то нет...
Отправлено: pastor от Октябрь 13, 2009, 14:26
Выкладывай код, будем смотреть


Название: Re: qobject_cast то работает то нет...
Отправлено: SASA от Октябрь 13, 2009, 17:19
Зачитался.  ::)
Я не зря писал про коменты. Конечно, код типа parent()->parent()->parent()->.... нужно рефакторить. Но это очень опасное и долгое занятие. Бывают случаи, когда такие костыли работают и трогать их не хочется. Но рядом должен быть комент, который разяснял бы откуда этот костыль взялся и какую дырку он закрывает. Ещё такие костыли я обклабываю кучей ASSERT. И если один из них всплывает я читаю комент и, либо "чиню" костыль, либо рефакторю код.
Я не использую юнит тесты (к моему великому сожелению), поэтому рефакоринг занимает у меня МНОГО времени и сил.


Название: Re: qobject_cast то работает то нет...
Отправлено: Krow от Октябрь 13, 2009, 19:19
класс mainWindow
.h
Код:
class fMyOrg;
...
class mainWindow : public QMainWindow
{
Q_OBJECT
public:
mainWindow();
QString dirCount;
...
private:
fMyOrg *createFormMyOrg();
private slots:
void setDirCount(const QString &str );
};
.cpp
Код:
fMyOrg *mainWindow::createFormMyOrg()
{
fMyOrg *child = new fMyOrg;
g_fMyOrg = child;
connect (child, SIGNAL(changedString( const QString & )), this, SLOT(setDirCount( const QString & )));
child->dirCount = dirCount;
workspace->addWindow(child);
return child;
}
void mainWindow::setDirCount(const QString &str)
{
dirCount = str;
ui.actNumberSklad->setText(dirCount);
}
класс fMyOrg
.h
Код:
class fMyOrg : public QWidget
{
Q_OBJECT
public:
QString dirCount;
...
signals:
void changedString( const QString &str );
};
.cpp
Код:
void fMyOrg::pbAddSkladClicked()
{
...
emit changedString(dirCount);
}
fMyOrg это чайлд. именно в функции pbAddSkladClicked() должен вызываться сигнал...
думаю что код понятен.. если что обязательно поясню что и где. весь код не выкладываю он большой, только основные куски кода.


Название: Re: qobject_cast то работает то нет...
Отправлено: Krow от Октябрь 15, 2009, 16:56
так что никто больше помочь не может?? стопорится программа на этом моменте  :(


Название: Re: qobject_cast то работает то нет...
Отправлено: BRE от Октябрь 15, 2009, 17:07
Странно все это.
fMyOrg::pbAddSkladClicked() точно выполняется?
До emit changedString(dirCount) управление точно доходит?
Поставь в ключевых местах отладочный вывод (qDebug() << ... ) и проверь.


Название: Re: qobject_cast то работает то нет...
Отправлено: Igors от Октябрь 15, 2009, 18:11
так что никто больше помочь не может?? стопорится программа на этом моменте  :(
Могут, но что можно сказать по тому огрызку что Вы показали? Проверьте что  fMyOrg имеет Q_OBJECT и moc'нулся. Не поможет - выкладывайте упрощенный пример который можно руками пощупать


Название: Re: qobject_cast то работает то нет...
Отправлено: Krow от Октябрь 15, 2009, 21:46
Странно все это.
fMyOrg::pbAddSkladClicked() точно выполняется?
До emit changedString(dirCount) управление точно доходит?
Поставь в ключевых местах отладочный вывод (qDebug() << ... ) и проверь.

блин... спасиб тебе большое... тока вот по прошествии 5 дней понял какой был дурак (в общем как и каждый программист допускающий глупую ошибку..) в общем emit сигнала был не в той процедуре... нужна была.. pbSkladDefaultClicked()