Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Задать фон одному виджету на форме
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
borune
сабж. Хочу сделать фоновое изображение для главного окна (ну или хотя бы просто цвет, если сделаю цвет, то и картинку поставить можно).

Пробую так:
MainWindow::Mainwindow(QWidget *parent):QMainWindow(parent)
{
...
setStyleSheet("background: green;");
...
}
У всех виджетов на форме становится зеленый фон. Читаю доки, пробую задать фон только объектам класса QMainWindow следующим образом:
int main(int argc, char **argv)
{
QApplication app(argc, argv);
...
MainWindow mainWin;
app.setStyleSheet("QMainWindow { background: green}");
...
}
эффект точно такой же - у всех зеленеет фон. Читаю еще, пробую задать свойства через имя объекта:
]int main(int argc, char **argv)
{
QApplication app(argc, argv);
...
MainWindow mainWin;
mainWin.setObjectName("main");
app.setStyleSheet("QMainWindow#main { background: green}");
...
}
тоже не помогает. Подскажите, как же сделать?
marsel
Вообще если честно, очень легко гуглится.
Или я не правильно понял вопрос?

    QPalette palette;
    palette.setColor(QPalette::Background, Qt::green);
    mainWin.setPalette(palette);
    mainWin.setAutoFillBackground(true);

borune
Цитата(marsel @ 8.10.2014, 10:22) *
Вообще если честно, очень легко гуглится.
Или я не правильно понял вопрос?

    QPalette palette;
    palette.setColor(QPalette::Background, Qt::green);
    mainWin.setPalette(palette);
    mainWin.setAutoFillBackground(true);

Вопрос поняли правильно, а может и не совсем)
Ваш вариант делает то же самое, что и три варианта, которые я описал выше. Т.е. этот код задает зеленый фон ВСЕМ виджетам, находящимся на форме, а мне нужно задать фон ТОЛЬКО сАмому главному окну, не изменяя фон дочерних виджетов.
lanz
А все дело в том, что когда вы перегружаете styleSheet или палитру у родительского виджета, перегружается и у дочернего.
Чтобы этого избежать надо явно переоределить перегруженные аттрибуты дочернего виджета:
    QPalette palette;
    QColor oldBackColor = palette.color( QPalette::Background );
    palette.setColor(QPalette::Background, Qt::green);

    this->setPalette(palette);

    palette.setColor( QPalette::Background, oldBackColor );
    ui->widget->setPalette( palette );
    ui->widget->setAutoFillBackground( true );

Так же нужно выставить аттрибут autoFillBackground для дочернего виджета.
Об autoFillBackground:
http://qt-project.org/doc/qt-4.8/qwidget.h...ouble-buffering
О наследовании палитры:
http://qt-project.org/doc/qt-4.8/qwidget.html#palette-prop
Trisch
borune, Дело в том, что нельзя задать фон QMainWindow. Можно задать фон разделителям. Вот пример
borune
Цитата(lanz @ 8.10.2014, 21:48) *
А все дело в том, что когда вы перегружаете styleSheet или палитру у родительского виджета, перегружается и у дочернего.
Чтобы этого избежать надо явно переоределить перегруженные аттрибуты дочернего виджета:
а если у меня дочерних 50 штук, для каждого такое городить?
Цитата(Trisch @ 8.10.2014, 21:49) *
Дело в том, что нельзя задать фон QMainWindow
как это нельзя) фон-то меняется) скажу больше - даже картинку можно на фон поставить
Trisch
Цитата(borune @ 9.10.2014, 6:53) *
Цитата(lanz @ 8.10.2014, 21:48) *
А все дело в том, что когда вы перегружаете styleSheet или палитру у родительского виджета, перегружается и у дочернего.
Чтобы этого избежать надо явно переоределить перегруженные аттрибуты дочернего виджета:
а если у меня дочерних 50 штук, для каждого такое городить?
Цитата(Trisch @ 8.10.2014, 21:49) *
Дело в том, что нельзя задать фон QMainWindow
как это нельзя) фон-то меняется) скажу больше - даже картинку можно на фон поставить


Тогда перефразирую свою фразу. В QMainWindow можно задавать фон, но не стоит. Дело в том что QMainWindow составной виджет, и задавая ему фон задается фон всем виджетам, которые в него входят и их наследникам соответственно.

Хочешь задать фон центральной части? Задай фон именно центральному виджету, к примеру так:
QWidget#centralwidget {background: rgb(0, 255, 255);}


Хочешь задать фон меню, задавай фон именно меню, и так далее.
borune
Цитата(Trisch @ 9.10.2014, 14:01) *
Хочешь задать фон центральной части? Задай фон именно центральному виджету,

а толку, ведь любой виджет в окне является дочерним по отношению к центральному, поэтому изменение цвета центрального виджета вызовет изменения цвета у всех остальных виджетов
Trisch
Если задавать стиль по идентификатору, то стиль задается только виджетам с данным идентификатором, ну насколько я знаю :)

В общем попробуй, если не то, будем дальше думать.
lanz
Цитата
а если у меня дочерних 50 штук, для каждого такое городить?

Не для каждого, а только для тех, которые непосредственно вложены в MainWindow.
borune
Цитата(Trisch @ 9.10.2014, 18:28) *
Если задавать стиль по идентификатору, то стиль задается только виджетам с данным идентификатором, ну насколько я знаю :)

В общем попробуй, если не то, будем дальше думать.

так пробовал ж уже:
Цитата(borune @ 7.10.2014, 16:25) *
Читаю еще, пробую задать свойства через имя объекта:
int main(int argc, char **argv)
{
QApplication app(argc, argv);
...
MainWindow mainWin;
mainWin.setObjectName("main");
app.setStyleSheet("QMainWindow#main { background: green}");
...
}


Цитата( @ 9.10.2014, 19:37) *
Цитата
а если у меня дочерних 50 штук, для каждого такое городить?

Не для каждого, а только для тех, которые непосредственно вложены в MainWindow.

ну т.е. для тех, у кого parent равен моему мейнвиджету..у меня таких много, как вариант решения подойти должен, но, я думаю, никто не будет спорить, что решение не самое красивое, хочется чего-то более изящного

может можно как-то запретить виджетам наследовать палитру родителя?
Trisch
Цитата(borune @ 10.10.2014, 6:03) *
так пробовал ж уже:
Цитата(borune @ 7.10.2014, 16:25) *
Читаю еще, пробую задать свойства через имя объекта:

int main(int argc, char **argv)
{
QApplication app(argc, argv);
...
MainWindow mainWin;
mainWin.setObjectName("main");
app.setStyleSheet("QMainWindow#main { background: green}");
...
}


Центральный виджет в QMainWindow называется centralwidget, если вы его не переименовали явно.

задается ему цвет вот так:
QWidget#centralwidget {background: rgb(0, 255, 255);}


Еще раз повторюсь, QMainWindow это составной виджет, в стилях используется только для задания стиля перегородкам.
Для остальных случаев, используйте в настройках стилей название виджетов стили которых хотите изменить QWidget, QMenuBar, QToolBar и тд.
lanz
Цитата
может можно как-то запретить виджетам наследовать палитру родителя?

Нет, если это не окно:
Цитата
QWidget propagates explicit palette roles from parent to child. If you assign a brush or color to a specific role on a palette and assign that palette to a widget, that role will propagate to all the widget's children, overriding any system defaults for that role. Note that palettes by default don't propagate to windows (see isWindow()) unless the Qt::WA_WindowPropagation attribute is enabled.


Цитата
ну т.е. для тех, у кого parent равен моему мейнвиджету..у меня таких много, как вариант решения подойти должен,

Можно просто перебрать всех детей, через QObject::children(), только надо проверять что они виджеты.

Цитата
но, я думаю, никто не будет спорить, что решение не самое красивое, хочется чего-то более изящного

Вам шашечки или ехать? :lol:
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.