Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Az от Май 24, 2010, 19:48



Название: Обращение к динамически созданному виджету
Отправлено: Az от Май 24, 2010, 19:48
Коллеги, подскажите, как можно обратиться к динамически созданному ComboBox.
Создаю его с помощью setItemWidget, и встраиваю в одну колонку QTreeWidget следующим образом:
Код
C++ (Qt)
 
   QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget);
   item->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable);
   item->setCheckState(0, Qt::Checked);
   ui->treeWidget->clearSelection();
   item->setSelected(true);
   ui->treeWidget->setCurrentItem(item);
   QComboBox *combo = new QComboBox;
   ui->treeWidget->setItemWidget(item,1,combo);
   combo->addItem("http");
   combo->addItem("socks4");
   combo->addItem("socks5");
Пытался добраться до него через
Код
C++ (Qt)
ui->treeWidget->itemWidget(item, 0)->
но дальше дело не пошло.
При этом
Код
C++ (Qt)
ui->treeWidget->itemWidget(item, 0)->setVisible(false);
скрывает, и скрывает именно сам ComboBox, то есть до него вроде как доходит.


Название: Re: Обращение к динамически созданному виджету
Отправлено: Makss от Май 24, 2010, 20:06
Код:
((QComboBox *)ui->treeWidget->itemWidget(item, 0))->setVisible(false);


Название: Re: Обращение к динамически созданному виджету
Отправлено: bigirbis от Май 24, 2010, 20:56
Во-первых стоит пользоваться оператором dynamic_cast.
Во вторых, для таких особых случаев стоит изучить работу делегатов.


Название: Re: Обращение к динамически созданному виджету
Отправлено: Az от Май 24, 2010, 21:34
Спасибо за ответы.
Есть над чем по-мыслить.


Название: Re: Обращение к динамически созданному виджету
Отправлено: garryHotDog от Май 24, 2010, 21:46
лично я использую код который представил - Makss


Название: Re: Обращение к динамически созданному виджету
Отправлено: ритт от Май 24, 2010, 22:01
dynamic_cast? c-style cast?
Makss, bigirbis, garryHotDog - каждому по двойке.
забудьте эту чушь, когда оперируете экземплярами QObject!

QComboBox *combo = qobject_cast<QComboBox *>(ui->treeWidget->itemWidget(item, 0))
if (combo) ...
и только так!


Название: Re: Обращение к динамически созданному виджету
Отправлено: bigirbis от Май 24, 2010, 22:29
 :-X Согласен по поводу qobject_cast - конкретно лажанулся.


Название: Re: Обращение к динамически созданному виджету
Отправлено: radislav72 от Май 26, 2010, 07:49
забудьте эту чушь, когда оперируете экземплярами QObject!
...
и только так!

А почему так категорично? Тут такая серьезная ошибка, или просто отступление от "оптимального" варианта кода?


Название: Re: Обращение к динамически созданному виджету
Отправлено: Amigo_sa от Май 26, 2010, 10:03
Во-первых стоит пользоваться оператором dynamic_cast.
Во вторых, для таких особых случаев стоит изучить работу делегатов.
Для наследников QObject  предпочтительнее object_cast.


Название: Re: Обращение к динамически созданному виджету
Отправлено: Alex Custov от Май 26, 2010, 13:18
и только так!

да, зачем так категорично?