Странное поведение полей для элементов управления Qt

Я только начал использовать Qt (5.3) и столкнулся с тем, что некоторые элементы управления появляются с полями, которые я не могу контролировать.

Сначала я попытался поместить QLabel и QPushButton прямо в QMainWindow.

window = new QMainWindow;
label = new QLabel( title, window );

В этом случае метка появляется с полем в 12 пикселей вверху (см. Рисунок). QPushButton отображается с верхним и левым полями в 1 пиксель. Но если я вставлю QFrame с рамкой, он появится без полей.

https://stackru.com/images/148fd9358ec779f50929aacb40d44c1151b821d9.jpg

Таким образом, поля кажутся атрибутами QLabel и QPushButton. НО:

Когда я попытался добавить дополнительный QFrame между окнами и элементами управления:

window = new QMainWindow;
frame = new QFrame(window );
label = new QLabel( title, frame);

У меня получилось другое изображение: верхнее поле QLabels сократилось до 1 пикселя. QPushButton поля в 1 пиксель остались нетронутыми, но высота кнопки изменилась

Я пытался: setStyleSheet( "padding:0px") и setContentsMargins( 0, 0, 0, 0)

для всех элементов, но без какого-либо успеха.

Любая помощь будет принята с благодарностью

1 ответ

QMainWindow Класс не предназначен для непосредственного добавления к нему виджетов. Все результаты, которые вы видите, связаны с этим фактом.

"Поля", которые вы видите, на самом деле не являются полями. Так как QLabel это QFrameВы можете включить его фрейм, чтобы увидеть, что у него нет полей - просто текст смещен от края, и это по замыслу. Вы можете аналогичным образом наложить прозрачный прямоугольник того же размера на QPushButton чтобы увидеть, что также нет никакого запаса, просто стиль добавляет свой собственный запас для конкретной платформы. Не путайте механизм стилевого оформления платформы с таблицами стилей: это два отдельных механизма, в основном эксклюзивных, с использованием последних, за редким исключением отключаются эффекты первого. Например, интервал между таблицами стилей / поля / отступы являются аддитивными к любым требованиям стиля платформы.

Посмотрите этот ответ для примера того, как показать оверлеи на любом виджете без подклассов.

Другие вопросы по тегам