Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: carhun от Май 13, 2012, 22:52



Название: QTreeWidget
Отправлено: carhun от Май 13, 2012, 22:52
Добрый день.

Возник такой вопрос, как лучше реализовать такого рода интерфейс. ( см. приложенный файлик, да, он фиговый, но лучше я нарисовать не смогу=) ).

Соотв., как я делаю сейчас:
1. Создаю QTreeWidget
2. Создаю для QTreeWidget QTreeWidgetItem с названием графика
3. Создаю child() для QTreeWidgetItem в к-ый я запихиваю QwtPlot.

Все было бы хорошо, но оно как не красиво получается, хотелось бы так как я "нарисовал" на картинке, но тогда возникает пару проблем/вопросов:
1. как сделать, что бы постоянно появляляся слева треуголльничек и на него можно было нажимать и соотв. от этого появлялся или исчезал график?
2. почему когда я создал  QTreeWidget с 2мя столбцами и делаю что-то на подобие этого, то получаю что QwtPlot не растягивается автоматически:

Код:
    QTreeWidgetItem *top = new QTreeWidgetItem();
    top->setText(0, "TOP");
....
    QwtPlot *test = new QwtPlot(this);
    tree->setItemWidget(top, 1, test);

Еще приложу картинки, как у меня получается сейчас, что бы было яснее по поводу моих комменатриев, что я хочу...

И еще вопрос общего характера. Что делать, если намечается такого рода кода, какой написан выше достаточно много... Т.е. будет много подобного кода, где будет создаваться практически одинаковые QTreeWidgetItem. Собственно, как с этим бороться?

Спасибо за внимание и надеюсь, что вы сможете мне что-то подсказать по этому поводу.


Название: Re: QTreeWidget
Отправлено: carhun от Май 15, 2012, 14:44
Добрый день!

Не большое добовление, я не уверен, что мне надо конктерно QTreeWidet... Так что если подобного рода виждет делается как-то по другому, то подскажите как.. Или что бы получить такой интерфейс может надо вообще с нуля создавать такой виджет?

Спасибо за внимание.


Название: Re: QTreeWidget
Отправлено: V1KT0P от Май 15, 2012, 15:47
Либо через делегаты, либо если через делегаты не удается создать нужную вещь, то с нуля тоже делается просто.


Название: Re: QTreeWidget
Отправлено: carhun от Май 16, 2012, 10:53
А не подскажите как отловить нажатие на треугольничек? Ну, или как это делает Qt, что когда я нажимаю на треугольник, он открывает все чайлды? Когда я нажимаю 2й раз на треугольник, то тогда генерируется сингал itemCollapsed, а как отловить когда нажимается первый раз?

И можете дать какой-то туториал по тому как создать с нуля свои виджеты?


Название: Re: QTreeWidget
Отправлено: kambala от Май 16, 2012, 11:03
А не подскажите как отловить нажатие на треугольничек? Ну, или как это делает Qt, что когда я нажимаю на треугольник, он открывает все чайлды? Когда я нажимаю 2й раз на треугольник, то тогда генерируется сингал itemCollapsed, а как отловить когда нажимается первый раз?
ну как так можно читать справку?!
Цитировать
void QTreeWidget::itemCollapsed ( QTreeWidgetItem * item ) [signal]
This signal is emitted when the specified item is collapsed so that none of its children are displayed.
Note: This signal will not be emitted if an item changes its state when collapseAll() is invoked.
See also QTreeWidgetItem::isExpanded(), itemExpanded(), and collapseItem().


Название: Re: QTreeWidget
Отправлено: carhun от Май 16, 2012, 12:01
Видимо я плохо читал справу, но я до отправки сообщения на форум попробывал отловить вообще все синалы след. образом:

Код:
#ifndef GRAPHICWIDGET_H
#define GRAPHICWIDGET_H

#include <QWidget>

class QTreeWidgetItem;

class GraphicWidget : public QWidget
{
    Q_OBJECT
public:
    explicit GraphicWidget(QWidget *parent = 0);
....   
public slots:
    void currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
    void itemActivated(QTreeWidgetItem *item, int column);
    void itemChanged(QTreeWidgetItem *item, int column);
    void itemClicked(QTreeWidgetItem *item, int column);
    void itemCollapsed(QTreeWidgetItem *item);
    void itemDoubleClicked(QTreeWidgetItem *item, int column);
    void itemEntered(QTreeWidgetItem *item, int column);
    void itemExpanded(QTreeWidgetItem *item);
    void itemPressed(QTreeWidgetItem *item, int column);
    void itemSelectionChanged();
};

#endif // GRAPHICWIDGET_H

Код:
#include "graphicwidget.h"

#include <QVBoxLayout>
#include <QTreeWidget>
#include <QHeaderView>

#include "graphicplot.h"

GraphicWidget::GraphicWidget(QWidget *parent) : QWidget(parent) {
    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    QTreeWidget *tree = new QTreeWidget(this);
   
    ......

    mainLayout->addWidget(tree);
    setLayout(mainLayout);

    connect(tree, SIGNAL(itemActivated(QTreeWidgetItem*,int)), this, SLOT(itemActivated(QTreeWidgetItem*,int)));
    connect(tree, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(itemChanged(QTreeWidgetItem*,int)));
    connect(tree, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(itemClicked(QTreeWidgetItem*,int)));
    connect(tree, SIGNAL(itemCollapsed(QTreeWidgetItem*)), this, SLOT(itemCollapsed(QTreeWidgetItem*)));
    connect(tree, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT(itemDoubleClicked(QTreeWidgetItem*,int)));
    connect(tree, SIGNAL(itemEntered(QTreeWidgetItem*,int)), this, SLOT(itemEntered(QTreeWidgetItem*,int)));
    connect(tree, SIGNAL(itemPressed(QTreeWidgetItem*,int)), this, SLOT(itemPressed(QTreeWidgetItem*,int)));
    connect(tree, SIGNAL(itemSelectionChanged()), this, SLOT(itemSelectionChanged()));
}

void GraphicWidget::currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
{
    qDebug() << "GraphicWidget::currentItemChanged";
}

void GraphicWidget::itemActivated(QTreeWidgetItem *item, int column) {
    qDebug() << "GraphicWidget::itemActivated";
}

void GraphicWidget::itemChanged(QTreeWidgetItem *item, int column)
{
    qDebug() << "GraphicWidget::itemChanged";
}

void GraphicWidget::itemClicked(QTreeWidgetItem *item, int column)
{
    qDebug() << "GraphicWidget::itemClicked";
}

void GraphicWidget::itemCollapsed(QTreeWidgetItem *item)
{
    qDebug() << "GraphicWidget::itemCollapsed";
}

void GraphicWidget::itemDoubleClicked(QTreeWidgetItem *item, int column)
{
    qDebug() << "GraphicWidget::itemDoubleClicked";
}

void GraphicWidget::itemEntered(QTreeWidgetItem *item, int column)
{
    qDebug() << "GraphicWidget::itemEntered";
}

void GraphicWidget::itemExpanded(QTreeWidgetItem *item)
{
    qDebug() << "GraphicWidget::itemExpanded";
}

void GraphicWidget::itemPressed(QTreeWidgetItem *item, int column)
{
    qDebug() << "GraphicWidget::itemPressed";
}

void GraphicWidget::itemSelectionChanged()
{
    qDebug() << "GraphicWidget::itemSelectionChanged";
}

И как результат при нажатии на треугольник вызывается только:
Код:
void GraphicWidget::itemCollapsed(QTreeWidgetItem *item)
{
    qDebug() << "GraphicWidget::itemCollapsed";
}

Вызывается естственно на 2е нажатие на треугольник...

Соотвественно, вопрос, что я делаю не так тогда?


Название: Re: QTreeWidget
Отправлено: kambala от Май 16, 2012, 12:03
ну и где у тебя коннект для itemExpanded()?


Название: Re: QTreeWidget
Отправлено: carhun от Май 16, 2012, 12:14
Блин...

Спасибо всем, на данный момент мне все понятно.

Тему можно закрывать.