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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Виджет-контейнер для других виджетов[Решено]  (Прочитано 3674 раз)
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 нельзя создать такую структуру графическую?

Заранее благодарен за помощь.
« Последнее редактирование: Май 21, 2012, 14:45 от soiam » Записан
mutineer
Гость
« Ответ #1 : Май 21, 2012, 14:02 »

setLayout(layout);
Записан
soiam
Гость
« Ответ #2 : Май 21, 2012, 14:05 »

никакого эффекта.
Записан
trot
Гость
« Ответ #3 : Май 21, 2012, 14:21 »

сам объект класса QDevControl_Widget надо разместить в какой-то layout
Записан
soiam
Гость
« Ответ #4 : Май 21, 2012, 14:24 »

Да, я в проекте размещаю его в один из лейаутов формы. Хотя в будущем планируется этот виджет drag-and-drop делать
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Май 21, 2012, 14:25 »

setLayout(layout);
Код
C++ (Qt)
layout = new QBoxLayout(QBoxLayout::LeftToRight,this);
Как бы уже подразумевает это.

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

Qt 5.11/4.8.7 (X11/Win)
soiam
Гость
« Ответ #6 : Май 21, 2012, 14:26 »

Но что удивительно, оно так не отображается Улыбающийся
Цитировать
Укажи 0 в качестве родителя и сам увидишь.
В качестве родителя чего?
« Последнее редактирование: Май 21, 2012, 14:31 от soiam » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



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

Qt 5.11/4.8.7 (X11/Win)
soiam
Гость
« Ответ #8 : Май 21, 2012, 14:45 »

Всё, понял. Я вам немного урезанный класс дал, там было еще несколько функций, которые я посчитал несущественными. Первоначально у меня был класс QBoxLayout и я для него сделал функции hide(), show(),setVisible(), которые отображали либо прятали внутренние виджеты. И забыл их убрать, когда переделал с QBoxLayout на QWidget. Наверное, они конфликтовали как-то. Убрал эти virtual функции, всё заработало.
Большое спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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