Russian Qt Forum

Qt => Вопросы новичков => Тема начата: qt_newer от Июль 31, 2014, 13:14



Название: динамическая смена цвета с использованием qss
Отправлено: qt_newer от Июль 31, 2014, 13:14
Например, есть кнопка при нажатии на кот. ее цвет должен поменяться на зеленый, при повторном нажатии вернуться к исходному.
Использую такой код:
btn->setStyleSheet("background-color:green");
& back: btn->setStyleSheet("");
Как сделать то же самое с использованием qss (чтобы при изменении дизайна не приходилось долго рыться в коде)?
Спасибо заранее!


Название: Re: динамическая смена цвета с использованием qss
Отправлено: Johnik от Июль 31, 2014, 13:24
выдернул из своего приложения:
Код:
QToolButton, QPushButton {
    background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(254, 254, 254, 255), stop:1 rgba(208, 208, 208, 255));
    border: 2px solid rgba(178, 178, 178, 255);
    border-radius: 5px;
    padding: 2px;
}

QToolButton:checked, QPushButton:checked {
    background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(57, 181, 74, 255), stop:1 rgba(7, 150, 70, 255));
    border-color: rgba(0, 146, 69, 255);
    border-style: inset;
}

QToolButton:pressed, QPushButton:pressed {
    background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(57, 181, 74, 255), stop:1 rgba(7, 150, 70, 255));
    border-color: rgba(0, 146, 69, 255);
    border-style: inset;
}


Название: Re: динамическая смена цвета с использованием qss
Отправлено: qt_newer от Август 01, 2014, 12:40
Спасибо! Очень помогли!
Но есть еще одна проблема- надо получить:
текст                     х (иконка чекбокса)
длинный_текст      х
текст2                   х

делаю:
    QVBoxLayout *main_layout = new QVBoxLayout;

    QCheckBox *cb = new QCheckBox(tr("текст"), this);
    cb->setLayoutDirection(Qt::RightToLeft);

    main_layout->addWidget(cb);
    setLayout(main_layout);

и пишу в qss:

QCheckBox {
    text-align: left;
    color: green;  /* задача поменять цвет текста при переключении */
    background-color: grey;
}
QCheckBox:checked {
    color: red;
}

QCheckBox::indicator:unchecked {
    image: url(:/images/unchecked.png);
}

QCheckBox::indicator:checked {
    image: url(:/images/checked.png);
}

В результате:  "text-align: left" НЕ РАБОТАЕТ (хотя, элемент чекбокса растянут на всю ширину окна приложения), и результат выглядит как:
                         текст   х (иконка чекбокса)
          длинный_текст   х
                       текст2   х
 


Название: Re: динамическая смена цвета с использованием qss
Отправлено: Johnik от Август 01, 2014, 13:40
попробовал различные варианты, тоже не получается.

как вариант, убрать текст у QCheckBox, слева разместить QLabel и воспользовать setBuddy() у QLabel.


Название: Re: динамическая смена цвета с использованием qss
Отправлено: qt_newer от Август 01, 2014, 15:05
а при этом как-то можно изменить цвет QLabel в qss ? (как это делалось для QCheckBox)

QCheckBox {
    color: green;  /* задача поменять цвет текста при переключении */
}
QCheckBox:checked {
    color: red;
}
Опять же, чтобы при изменении дизайна не приходилось долго рыться в коде


Название: Re: динамическая смена цвета с использовани&#
Отправлено: Johnik от Август 01, 2014, 22:29
Думаю без костыля не обойтись...

делаем стиль:
Код
CSS
QCheckBox::checked { color: red; }
 
QLabel[checked="true"] { color: red; }
 

создаем объекты: QCheckBox (имя: "сheckBox") и для него партнера QLabel (имя: "checkBox_label")
и еще пару: QCheckBox (имя: "сheckBox_2") и для него партнера QLabel (имя: "checkBox_2_label")

h:
Код
C++ (Qt)
...
private slots:
void changeChecked(bool checked);
private:
void setLabelChecked(QLabel* label, bool checked);
...
 
cpp:
Код
C++ (Qt)
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
connect(ui->checkBox, &QAbstractButton::toggled,
this, &Widget::changeChecked);
setLabelChecked(ui->checkBox_label, ui->checkBox->isChecked());
 
connect(ui->checkBox_2, &QAbstractButton::toggled,
this, &Widget::changeChecked);
setLabelChecked(ui->checkBox_2_label, ui->checkBox_2->isChecked());
}
 
void Widget::changeChecked(bool checked)
{
if (!sender()) { return; }
QLabel* label = sender()->parent()->
findChild<QLabel*>(sender()->objectName() + "_label");
if (label) {
setLabelChecked(label, checked);
}
}
 
void Widget::setLabelChecked(QLabel* label, bool checked)
{
label->setProperty("checked", checked);
label->style()->unpolish(label);
label->style()->polish(label);
label->update();
}
 

проверил, работает.