Виджет внутри другого виджета Qt

Я пытаюсь достичь этого макета:

введите описание изображения здесь

где Widget1 - это какой-то виджет (центральный виджет QMainWindow), и я хочу добавить второй виджет Widget2 поверх него, но он должен быть в левом нижнем углу Widget1.


EDIT: мое предыдущее описание было не очень полезным, поэтому я попытаюсь описать его более подробно.

Я наследую класс QWidget (class MyClass : public QWidget) и создаю свой собственный виджет, где я в void MyClass ::paintEvent(QPaintEvent *event) рисую что-то на экране. MyClass тогда centralWidget моего QMainWindow.

Теперь, кроме того, я хочу добавить меньший виджет (виджет 2 на изображении), где я буду отображать видео (здесь я не спрашиваю, как отображать видео, а только как добавить этот виджет 2 в мое представление). Главное здесь то, что Widget2 находится внутри (плавает внутри) Widget1.

EDIT2: Предыдущий код, который я опубликовал, — ерунда.


person carobnodrvo    schedule 15.07.2016    source источник
comment
это не работает, это не очень хорошее описание проблемы. Кроме того, нужно больше информации, желательно больше кода. Какой макет вы используете? Что еще есть в макете? В зависимости от того, что еще есть, вы, вероятно, захотите QGridLayout, хотя вы можете добиться того, чего хотите, и многими другими способами. Вы используете Designer или создаете виджеты в своем собственном коде?   -  person hyde    schedule 15.07.2016
comment
вы должны сначала создать объект макета в соответствии с требованиями, проверьте эту ссылку   -  person Atul N    schedule 15.07.2016
comment
Не могли бы вы проверить мое редактирование, я пытался быть более точным.   -  person carobnodrvo    schedule 15.07.2016


Ответы (1)


Используйте QGridLayout, чтобы установить положение виджета:

QGridLayout* layout = new QGridLayout(this);
// 2x2 layout
QWidget* green = new QWidget(this);
green->setStyleSheet("background:green;");
QWidget* yellow = new QWidget(this);
yellow->setStyleSheet("background:yellow;");
QWidget* red = new QWidget(this);
red->setStyleSheet("background:red;");
QWidget* blue = new QWidget(this);
blue->setStyleSheet("background:blue;");
layout->addWidget(green, 0, 0); // Top-Left
layout->addWidget(yellow, 0, 1); // Top-Right
layout->addWidget(red, 1, 0); // Bottom-Left
layout->addWidget(blue, 1, 1); // Bottom-Right
ui->centralWidget->setLayout(layout);

Даст вам что-то вроде этого:

введите описание изображения здесь

Итак, настройте свой собственный виджет с помощью QGridLayout и установите положение вашего виджета внутри него.

Установите другой виджет в качестве родителя с черным фоном:

QGridLayout* layout = new QGridLayout(this);
// 2x2 layout
QWidget* green = new QWidget(this);
green->setStyleSheet("background:green;");
QWidget* yellow = new QWidget(this);
yellow->setStyleSheet("background:yellow;");
QWidget* red = new QWidget(this);
red->setStyleSheet("background:red;");
QWidget* blue = new QWidget(this);
blue->setStyleSheet("background:blue;");
layout->addWidget(green, 0, 0); // Top-Left
layout->addWidget(yellow, 0, 1); // Top-Right
layout->addWidget(red, 1, 0); // Bottom-Left
layout->addWidget(blue, 1, 1); // Bottom-Right

QWidget* mainWidget = new QWidget(this);
mainWidget->setStyleSheet("background:black;");
mainWidget->setLayout(layout);

QHBoxLayout* centralLayout = new QHBoxLayout(this);
centralLayout->addWidget(mainWidget);
ui->centralWidget->setLayout(centralLayout);

введите описание изображения здесь

person mohabouje    schedule 15.07.2016
comment
Главное, чего я пытаюсь добиться, это наличие одного виджета (виджет1 на изображении) и другого виджета над ним (виджет2 на изображении). - person carobnodrvo; 15.07.2016
comment
ui-›centralWidget — ваш основной виджет, а остальные — поверх него. Я добавил новый пример с родительским виджетом с черным фоном и другим над ним - person mohabouje; 15.07.2016
comment
Спасибо, это было полезно, единственное, что сейчас у меня есть только 1 виджет (например, внизу слева), и он растянут на всю ширину/высоту, и мне кажется, что я не могу изменить его размер. Вы знаете, как я могу это решить? - person carobnodrvo; 15.07.2016
comment
Установите флажок QSplitter, чтобы изменить размер макета doc.qt.io/qt-5/qsplitter.html - person mohabouje; 15.07.2016
comment
Остерегайтесь товарища С.О. Гражданин, этот пост является пропагандой Microsoft! (orig05.deviantart.net/e2b8/f /2012/035/f/7/) - person Lennart Rolland; 17.07.2016