Дебаг styleSheet подключенных из qss - Qt/С++
Есть кастомный класс унаследованный от QTimeEdit и ему задается свойство setButtonSymbols(QAbstractSpinBox::NoButtons);
И есть стили, которые устанавливаются в .qss.
Пример:
QAbstractSpinBox[buttonSymbols="0"]::up-arrow,
QAbstractSpinBox[buttonSymbols="0"]::down-arrow
{
...
}
QAbstractSpinBox[buttonSymbols="0"]
{
...
}
QAbstractSpinBox[buttonSymbols="0"]::up-button
{
...
}
QAbstractSpinBox[buttonSymbols="0"]::down-button
{
...
}
QAbstractSpinBox[buttonSymbols="0"]::up-button
{
...
}
QAbstractSpinBox[buttonSymbols="0"]::up-button:hover
{
...
}
QAbstractSpinBox[buttonSymbols="0"]::up-button:pressed
{
...
}
QAbstractSpinBox[buttonSymbols="0"]::up-button:disabled
{
...
}
QAbstractSpinBox[buttonSymbols="0"]::down-button
{
...
}
QAbstractSpinBox[buttonSymbols="0"]::down-button:hover
{
...
}
QAbstractSpinBox[buttonSymbols="0"]::down-button:pressed
{
...
}
QAbstractSpinBox[buttonSymbols="0"]::down-button:disabled
{
...
}
Проблема и закоючается в том, что эти стили применяются к контроллу, хотя не должны, так как у него значение проперти другое, а именно buttonSymbols=2 значение проперти проверял выведя ее в консоль в цикле с помощью QMetaObject. В связи с этим 2 вопроса:
Возможные причины, почему стили все равно применяются несмотря на то, что не должны? (К остальным контроллам все корректно применяется, т.е. сам файл
qssкорректно устанавливается черезsetStyleSheet).Как дебажить эти проблемы, т.е. есть ли возможность как то смотреть какие именно стили применяются объекту или выводить как то в дебаг применение стилей? Выводил опять же в консоль значение проперти
styleSheet, сразу после методаshow()ничего не получил, там пустая строка.
Ответы (1 шт):
Ваша цель пока не вполне ясна, но попробуем немного накидать...
для начала Читаем доки, обращая внимание на:
Note: Use the qproperty syntax with care, as it modifies the widget that is being painted. Also, the qproperty syntax is evaluated only once, which is when the widget is polished by the style. This means that any attempt to use them in pseudo-states such as QPushButton:hover, will not work.
Теперь к практике. Будем менять стиль в зависимости от имеющегося свойства buttonSymbols и добавим кастомное свойство myProperty, которое также будет влиять на стиль . На форме расположены QPushButton и QSpinBox.
Стиль для спинбокса:
QSpinBox[myProperty="0"]{color: red;}
QSpinBox[myProperty="1"]{color: blue;}
QSpinBox[myProperty="2"]{color: green;}
QSpinBox[buttonSymbols="0"]{ background-color: green;}
QSpinBox[buttonSymbols="1"]{ background-color: red;}
QSpinBox[buttonSymbols="2"]{ background-color: blue;}
код формы:
void MainWindow::on_spinBox_valueChanged(const QString &arg1)
{
ui->spinBox->setProperty("myProperty",arg1);
ui->spinBox->style()->polish(ui->spinBox); // Обратите внимание сюда
}
void MainWindow::on_pushButton_clicked()
{
int btns = ui->spinBox->buttonSymbols();
ui->spinBox->setButtonSymbols((QAbstractSpinBox::ButtonSymbols)(btns<3?btns+1:0));
ui->spinBox->style()->polish(ui->spinBox); // Обратите внимание сюда
}
Запускаем, смотрим. При изменении значения спинбокса получаем изменение цвета, а при нажатии на кнопку будет меняться buttonSymbols и соответственно изменяться цвет фона