Russian Qt Forum

Qt => Общие вопросы => Тема начата: kataklysm от Ноябрь 08, 2010, 12:48



Название: QTabWidget+QTreeWidget+...
Отправлено: kataklysm от Ноябрь 08, 2010, 12:48
Как правильно добавлять новую вкладку в QTabWidget c новым QTreeWidget.
tabWidget->addTab(new QTreeWidget(),"Блабла") не катит.

Проблема в том что QTreeWidget должен быть уникальным в каждой вкладке(для работы с данными в нем). QTreeWidget - n-количество.
Код:
QTreeWidget **tree
tree= new QTreeWidget*[size];
for(....)
tree[i] = new QTreeWidget;
ИМХО тут не катит, так как size изначально не известен.

Натолкните пожалуйста на мысль, спасибо.


Название: Re: QTabWidget+QTreeWidget+...
Отправлено: Пантер от Ноябрь 08, 2010, 13:02
А чем tabWidget->addTab(new QTreeWidget(),"Блабла") не катит?


Название: Re: QTabWidget+QTreeWidget+...
Отправлено: kataklysm от Ноябрь 08, 2010, 13:09
А чем tabWidget->addTab(new QTreeWidget(),"Блабла") не катит?
А разве так можно будет обращаться к каждому QTreeWidget? Если можно то подскажите пожалуйста. Спасибо.

Например вот так:

Код:
QTreeWidgetItem *item = new QTreeWidgetItem;
item->setText(0, t_str);
item->setText(1, a_str);
item->setText(2, l_str);
treeWidget->addTopLevelItem(item);


Название: Re: QTabWidget+QTreeWidget+...
Отправлено: Пантер от Ноябрь 08, 2010, 13:16
QWidget * QTabWidget::widget ( int index ) const

Т.е.
Код
C++ (Qt)
QTreeWidget *w = qobject_cast <QTreeWidget*> (tabWidget->widget (0));
if (w) {
 //Some code
}
 

И назначай родителя для QTreeWidget, т.е.
tabWidget->addTab(new QTreeWidget (tabWidget),"Блабла")
Чтобы избежать утечек.


Название: Re: QTabWidget+QTreeWidget+...
Отправлено: Авварон от Ноябрь 08, 2010, 13:20
Когда виджет кладется на табвиджет, будет сделан репарент. Иначе как он положится?) Ну или протести, если не лень.


Название: Re: QTabWidget+QTreeWidget+...
Отправлено: Пантер от Ноябрь 08, 2010, 13:25
Не важно. Лучше приучиться указывать родителя.


Название: Re: QTabWidget+QTreeWidget+...
Отправлено: kataklysm от Ноябрь 08, 2010, 16:49
Код:
    QTreeWidget *w = qobject_cast <QTreeWidget*> (tabWidget->widget(0));
    if (w) {
qDebug()<<"TRUE"
      w->setAlternatingRowColors(true);
      w->setColumnCount(2);
      tabWidget->addTab(w,itemout->text(0));
    }
Ну собственно так и получается. Вкладки не добавляется, а заменяется.


Название: Re: QTabWidget+QTreeWidget+...
Отправлено: Пантер от Ноябрь 08, 2010, 17:11
tabWidget->addTab(w,itemout->text(0)); - это зачем??? w и так уже есть вкладка tabWidget'а.


Название: Re: QTabWidget+QTreeWidget+...
Отправлено: Авварон от Ноябрь 08, 2010, 17:30
я разве где-то говорил, что 1 виджет можно добавить несколько раз?) Вроде нет, не надо меня цитировать)
А вот сейчас говорю - один виджет нельзя добавить несколько раз на одну (или не одну) табвиджету


Название: Re: QTabWidget+QTreeWidget+...
Отправлено: kataklysm от Ноябрь 08, 2010, 18:19
tabWidget->addTab(w,itemout->text(0)); - это зачем??? w и так уже есть вкладка tabWidget'а.

Спасибо большое Вам. Все работает.


Название: Re: QTabWidget+QTreeWidget+...
Отправлено: kataklysm от Ноябрь 10, 2010, 18:06
Код:
    QTreeWidget *w = qobject_cast <QTreeWidget*> (tabWidget->widget(i));
    if (w) {
      w->setAlternatingRowColors(true);
      w->setColumnCount(2);
    }
Ну собственно так и получается. Вкладки не добавляется, а заменяется.

И как после этого получить доступ к w (QTreeWidget) в другом классе? Извините за глупость если что :)


Название: Re: QTabWidget+QTreeWidget+...
Отправлено: Пантер от Ноябрь 10, 2010, 18:18
В каком классе? И зачем?


Название: Re: QTabWidget+QTreeWidget+...
Отправлено: kataklysm от Ноябрь 10, 2010, 18:24
В каком классе? И зачем?
В слоте. По нажатию на кнопку должен обновится список в QTreeWidget, который является в свою очередь "ребенком" у QTabWidget. Спасибо.


Название: Re: QTabWidget+QTreeWidget+...
Отправлено: Пантер от Ноябрь 10, 2010, 18:26
Посылай сигнал главному окну, а он пусть обновит.


Название: Re: QTabWidget+QTreeWidget+...
Отправлено: kataklysm от Ноябрь 10, 2010, 22:04
Посылай сигнал главному окну, а он пусть обновит.

Извиняюсь, не совсем понял или плохо объяснил.

Добавляю табы к QTabWidget и загружаю первичный данные:
Код:
tabWidget->addTab(new QTreeWidget(tabWidget),itemout->text(0));

w = qobject_cast <QTreeWidget*> (tabWidget->widget(p));
    if (w)
    {
        w->setAlternatingRowColors(true);
        w->setColumnCount(2);
        w->setHeaderLabels(headerTopic);
        w->setAlternatingRowColors(true);
        connect(w,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(open_browser()));
        ............
    }

И как обновить данные в 3 w(QTreeWidget), имея родителя QTabWidget, в другом слоте.

Например так:
Код:
  
QTreeWidgetItem *item = new QTreeWidgetItem;
                item->setText(0, t_str);
                item->setText(1, a_str);
                item->setText(2, l_str);
                //item->setText(3, m_str);
                 w->addTopLevelItem(item); //Не въехал...

Спасибо.


Название: Re: QTabWidget+QTreeWidget+...
Отправлено: Пантер от Ноябрь 11, 2010, 09:59
Передай другому классу указатель на qobject_cast <QTreeWidget*> (tabWidget->widget(Х));


Название: Re: QTabWidget+QTreeWidget+...
Отправлено: kataklysm от Ноябрь 13, 2010, 19:24
Код:
    tabWidget->addTab(new QTreeWidget(tabWidget),url_name.value(d));

    w = qobject_cast <QTreeWidget*> (tabWidget->widget(p));
    if (w)
    {
        w->setHeaderLabels(headerTopic);
        w->setAlternatingRowColors(true);
        w->header()->setStretchLastSection(false);
        w->header()->setResizeMode(0,QHeaderView::ResizeToContents);
        w->header()->setResizeMode(1,QHeaderView::Stretch);
        w->header()->setResizeMode(2,QHeaderView::ResizeToContents);
        w->header()->setResizeMode(3,QHeaderView::ResizeToContents);
        ....
             QTreeWidgetItem *item = new QTreeWidgetItem;
             .....
             w->addTopLevelItem(item);

    }

Одного не пойму, как в таком случае очищать память от item при удалении вкладки в QTabWidget? При этом QTreeWidget уже является дочерним окном у QTabWidget.  И будет ли вообще освободаться память при закрытии вкладки с помощью removeTab(int index). Спасибо.

При QTreeWidgetItem *item = new QTreeWidgetItem(w)

Программа вываливается.