Изменение цвета фона конкретного дочернего элемента QSplitter

#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. хм, это странно, похоже на то, как я это пробовал… Я подробнее рассмотрю это завтра. Уже спасибо.