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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTreeWidget  (Прочитано 5534 раз)
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. Собственно, как с этим бороться?

Спасибо за внимание и надеюсь, что вы сможете мне что-то подсказать по этому поводу.
Записан
carhun
Гость
« Ответ #1 : Май 15, 2012, 14:44 »

Добрый день!

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

Спасибо за внимание.
Записан
V1KT0P
Гость
« Ответ #2 : Май 15, 2012, 15:47 »

Либо через делегаты, либо если через делегаты не удается создать нужную вещь, то с нуля тоже делается просто.
Записан
carhun
Гость
« Ответ #3 : Май 16, 2012, 10:53 »

А не подскажите как отловить нажатие на треугольничек? Ну, или как это делает Qt, что когда я нажимаю на треугольник, он открывает все чайлды? Когда я нажимаю 2й раз на треугольник, то тогда генерируется сингал itemCollapsed, а как отловить когда нажимается первый раз?

И можете дать какой-то туториал по тому как создать с нуля свои виджеты?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #4 : Май 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().
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
carhun
Гость
« Ответ #5 : Май 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е нажатие на треугольник...

Соотвественно, вопрос, что я делаю не так тогда?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #6 : Май 16, 2012, 12:03 »

ну и где у тебя коннект для itemExpanded()?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
carhun
Гость
« Ответ #7 : Май 16, 2012, 12:14 »

Блин...

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

Тему можно закрывать.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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