#c #qt #qsplitter
#c #qt #QSplitter
Вопрос:
Я использую Qt Creator 4.13.1 с Qt 5.15.1 в Windows 10 Pro.
Я новичок в использовании таблиц стилей в Qt и немного смущен возможными селекторами QSplitter
и его дочерними элементами. Я хочу, чтобы 2 дочерних элемента были разделены разделителем-дескриптором и рисовали их фоны разными цветами.
Это пример szenario
QSplitter* splitter = new QSplitter();
QWidget* widgetA = new QWidget();
// add a layout with some further child widgets
QWidget* widgetB = new QWidget();
// add a layout with some further child widgets
splitter->addWidget(widgetA);
splitter->addWidget(widgetB);
layout()->addWidget(splitter);
где я пытался:
widgetA->setStyleSheet("background-color: #ff0000;");
который применяется ко всем дочерним виджетамwidgetA
(например, QLabels, QPushButtons, …), Но не к их окружениюwidgetA
splitter->setStyleSheet("background-color: #ff0000;");
применяется кwidgetA
,widgetB
и дескриптору и всем виджетам нижеwidgetA
иwidgetB
- именование
widgetA->setObjectName("Tim");
иsplitter->setStyleSheet("QWidget#Tim {background-color: #ff0000;}");
которое вообще не имеет никакого эффекта. - [РЕДАКТИРОВАТЬ]
splitter->setStyleSheet("QSplitter QWidget #Andy {background-color: #ff0000;}");
применяет фон только к определенному виджету внутри любого дочернего виджета. Но использованиеsplitter->setStyleSheet("QSplitter #Tim {background-color: #ff0000;}");
(опять же) не имеет никакого эффекта.
Как бы я установил значение background-color
widgetA
отдельно, чтобы не затрагивать дочерние элементы widgetA
или другой дочерний элемент разделителя widgetB
?
Комментарии:
1. Я не уверен, что понимаю проблему. Если вы хотите
widgetA
иметь определенную таблицу стилей, то вы вызываетеwidgetA->setStyleSheet(...)
— на самом деле это не имеет никакого отношения к разделителю.2.
widgetA->setStyleSheet("background-color: #ff0000;");
также следует установить цвет для контейнера. Я также протестировал его на всякий случай.
Ответ №1:
Я не вижу никаких проблем с использованием widget->setStyleSheet()
в вашем случае. Здесь я протестировал вашу реализацию setObjectName()
:
Application::Application(QWidget *parent) :
QWidget(parent)
{
//set a base layout for the parent of splitter
QHBoxLayout *boxLayout = new QHBoxLayout(this);
this->setLayout(boxLayout);
//allocate splitter with parent
QSplitter* splitter = new QSplitter(this);
QWidget* widgetA = new QWidget();
widgetA->setObjectName("widgetA");
widgetA->setLayout(new QVBoxLayout());
//example buttons as child for widgetA
QPushButton *p = new QPushButton("0",widgetA);
widgetA->layout()->addWidget(p);
p = new QPushButton("1",widgetA);
widgetA->layout()->addWidget(p);
p = new QPushButton("2",widgetA);
widgetA->layout()->addWidget(p);
p = new QPushButton("3",widgetA);
widgetA->layout()->addWidget(p);
//widgetB, all similar to widgetA
QWidget* widgetB = new QWidget();
widgetB->setObjectName("widgetB");
widgetB->setLayout(new QVBoxLayout());
widgetA->setStyleSheet("QWidget#widgetA{background-color: #ff0000;}");
widgetB->setStyleSheet("QWidget#widgetB{background-color: #00ff00;}");
p = new QPushButton("1",widgetB);
widgetB->layout()->addWidget(p);
p = new QPushButton("2",widgetB);
widgetB->layout()->addWidget(p);
p = new QPushButton("3",widgetB);
widgetB->layout()->addWidget(p);
//add both widgets to splitter
splitter->addWidget(widgetA);
splitter->addWidget(widgetB);
//add splitter to base layout
this->layout()->addWidget(splitter);
}
Вывод
Комментарии:
1. хм, это странно, похоже на то, как я это пробовал… Я подробнее рассмотрю это завтра. Уже спасибо.