Russian Qt Forum
Апрель 19, 2024, 03:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: динамическая смена цвета с использованием qss  (Прочитано 4795 раз)
qt_newer
Гость
« : Июль 31, 2014, 13:14 »

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

Сообщений: 339


Просмотр профиля
« Ответ #1 : Июль 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;
}
Записан
qt_newer
Гость
« Ответ #2 : Август 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   х
 
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #3 : Август 01, 2014, 13:40 »

попробовал различные варианты, тоже не получается.

как вариант, убрать текст у QCheckBox, слева разместить QLabel и воспользовать setBuddy() у QLabel.
Записан
qt_newer
Гость
« Ответ #4 : Август 01, 2014, 15:05 »

а при этом как-то можно изменить цвет QLabel в qss ? (как это делалось для QCheckBox)

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

Сообщений: 339


Просмотр профиля
« Ответ #5 : Август 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();
}
 

проверил, работает.
« Последнее редактирование: Август 01, 2014, 22:31 от Johnik » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.091 секунд. Запросов: 23.