Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: soiam от Май 21, 2012, 14:00



Название: Виджет-контейнер для других виджетов[Решено]
Отправлено: soiam от Май 21, 2012, 14:00
Доброго времени суток!

Пытаюсь создать свой виджет, который бы содержал упорядоченную структуру других виджетов. Есть созданный на основе QWidget класс
Код:
class QDevControl_Widget : public QWidget
{
    Q_OBJECT
public:
    QDevControl_Widget(QWidget *parent = 0);
private:
    QBoxLayout * layout;
    QVBoxLayout * layout_main;
    QGridLayout * layout_control;
    QToolButton * button_up;
    QToolButton * button_stop;
    QToolButton * button_down;
    QToolButton * button_comfort1;
    QToolButton * button_comfort2;
    QToolButton * button_script;
    QLabel  * label_photo;
    QSpinBox * spinbox;
}

Его конструктор
Код:
QDevControl_Widget::QDevControl_Widget(QWidget *parent):QWidget(parent)
{
    layout = new QBoxLayout(QBoxLayout::LeftToRight,this);
    layout_main = new QVBoxLayout();
    layout_control = new QGridLayout();
    label_photo = new QLabel(this);
    spinbox = new QSpinBox(this);
    button_up = new QToolButton(this);
    button_down = new QToolButton(this);
    button_stop = new QToolButton(this);
    button_comfort1 = new QToolButton(this);
    button_comfort2 = new QToolButton(this);
    button_script = new QToolButton(this);

    layout_control -> addWidget(button_up,0,0);
    layout_control -> addWidget(button_stop,1,0);
    layout_control -> addWidget(button_down,2,0);
    layout_control -> addWidget(button_comfort1,0,1);
    layout_control -> addWidget(button_comfort2,1,1);
    layout_control -> addWidget(button_script,2,1);
    layout_main -> addLayout(layout_control);
    layout_main -> addWidget(spinbox);

    layout -> addWidget(label_photo);
    layout -> addLayout(layout_main);
}
По идее этот код должен создать красивую структуру: матрицу 3 на 2 кнопки, под ней поле для ввода числа, а слева label для картинки. Так у меня и было, когда я наследовался не от QWidget, а от QBoxLayout. А теперь получается, что все элементы съехались и почти ни одного из них не видно. Не понимаю, в чем тут загвоздка? Неужели на основе QWidget нельзя создать такую структуру графическую?

Заранее благодарен за помощь.


Название: Re: Виджет-контейнер для других виджетов
Отправлено: mutineer от Май 21, 2012, 14:02
setLayout(layout);


Название: Re: Виджет-контейнер для других виджетов
Отправлено: soiam от Май 21, 2012, 14:05
никакого эффекта.


Название: Re: Виджет-контейнер для других виджетов
Отправлено: trot от Май 21, 2012, 14:21
сам объект класса QDevControl_Widget надо разместить в какой-то layout


Название: Re: Виджет-контейнер для других виджетов
Отправлено: soiam от Май 21, 2012, 14:24
Да, я в проекте размещаю его в один из лейаутов формы. Хотя в будущем планируется этот виджет drag-and-drop делать


Название: Re: Виджет-контейнер для других виджетов
Отправлено: GreatSnake от Май 21, 2012, 14:25
setLayout(layout);
Код
C++ (Qt)
layout = new QBoxLayout(QBoxLayout::LeftToRight,this);
Как бы уже подразумевает это.

По идее этот код должен создать красивую структуру: матрицу 3 на 2 кнопки, под ней поле для ввода числа, а слева label для картинки.
Все именно так и получается. С лейаутоми в QDevControl_Widget всё в порядке. Укажи 0 в качестве родителя и сам увидишь.


Название: Re: Виджет-контейнер для других виджетов
Отправлено: soiam от Май 21, 2012, 14:26
Но что удивительно, оно так не отображается :)
Цитировать
Укажи 0 в качестве родителя и сам увидишь.
В качестве родителя чего?


Название: Re: Виджет-контейнер для других виджетов
Отправлено: GreatSnake от Май 21, 2012, 14:32
В качестве родителя чего?
QDevControl_Widget

Код
C++ (Qt)
int main( int argc, char** argv )
{
QApplication app( argc, argv );
QDevControl_Widget w;
w.show();
return app.exec();
}


Название: Re: Виджет-контейнер для других виджетов
Отправлено: soiam от Май 21, 2012, 14:45
Всё, понял. Я вам немного урезанный класс дал, там было еще несколько функций, которые я посчитал несущественными. Первоначально у меня был класс QBoxLayout и я для него сделал функции hide(), show(),setVisible(), которые отображали либо прятали внутренние виджеты. И забыл их убрать, когда переделал с QBoxLayout на QWidget. Наверное, они конфликтовали как-то. Убрал эти virtual функции, всё заработало.
Большое спасибо