Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Brono от Август 04, 2016, 19:47



Название: Динамический цвет кнопки.
Отправлено: Brono от Август 04, 2016, 19:47
Доброго времени суток!

Проблема такова: надо сделать кнопку QPushButton, которая бы при нажатии выдавала диалог QColorDialog, а когда пользователь выбрал цвет, кнопка окрашивается в выбранный цвет и текст на кнопке меняется на "#aarrggbb". Со сменой текста проблем не возникает, но как сделать смену цвета?

Притом важно, чтобы цвет кнопки оставался постоянным во всех трёх состояниях.

Смена CSS делает так, что кнопка становится нужного цвета только в нажатом состоянии.


Название: Re: Динанамический цвет кнопки.
Отправлено: Alex Custov от Август 04, 2016, 19:52
Видимо нужно показать этот CSS?


Название: Моя попытка реализации (которая не работает)
Отправлено: Brono от Август 04, 2016, 20:29
Вот слот диалога, в котором я попытался это сделать:

Код
C++ (Qt)
void design_dlg::choose_color()
{
   // Создание диалога выбора цвета
   QColor temp = QColorDialog::getColor(Qt::white,
                                        this,
                                        "Выбор цвета...");
   // Установка надписи на кнопке
   ((QPushButton *) sender())->setText(QString().setNum(temp.rgb(), 16));
   // Создание CSS-записи:
   QString temp_style = QString().setNum(temp.rgb(), 16); // Считывание цвета
   temp_style.remove(0, 2); // Убираем прозрачность (не уверен, что CSS её поддерживает)
   temp_style = "background-color: #" + temp_style; // Объединяем директиву и цвет
   ((QPushButton *) sender())->setStyleSheet(temp_style); // Устанавливаем цвет
}
 

Оно не работает. Точнее работает, но цветной кнопка становится только в зажатом состоянии.


Название: Re: Динамический цвет кнопки.
Отправлено: VPS от Август 04, 2016, 22:24
Можно использовать палитру, например так:
Код
C++ (Qt)
QPushButton *btn = qobject_cast<QPushButton*>(sender());
if(btn && color.isValid())
{
  QPalette palette = btn->palette();
  palette.setColor(QPalette::Button, color);
  palette.setColor(QPalette::Light, color.lighter());
  palette.setColor(QPalette::Dark, color.darker());
  btn->setPalette(palette);
}
 


Название: Re: Динамический цвет кнопки.
Отправлено: Brono от Август 05, 2016, 23:12
Решение с палитрами не сработало.


Название: Re: Динамический цвет кнопки.
Отправлено: Racheengel от Август 05, 2016, 23:36
https://github.com/sintegrial/Qt5ExtLib/tree/master/src/qtgradienteditor

там есть QtColorButton


Название: Re: Динамический цвет кнопки.
Отправлено: Bepec от Август 05, 2016, 23:39
1) ";" в QSSse поставьте. (ну просто положено там быть, хотя на работоспособность не влияет).
2) используйте QString QColor::name(NameFormat format) const для получения строки цвета.


Название: Re: Динамический цвет кнопки.
Отправлено: VPS от Август 05, 2016, 23:56
Решение с палитрами не сработало.
А так:
Код
C++ (Qt)
#include "StartDialog.h"
#include <QApplication>
 
int main(int argc, char** argv)
{
QApplication app(argc, argv);
StartDialog  startDialog;
 
startDialog.setMinimumWidth(200);
startDialog.show();
 
return app.exec();
}
 
Код
C++ (Qt)
#ifndef _StartDialog_h_
#define _StartDialog_h_
 
#include <QWidget>
 
class StartDialog : public QWidget
{
Q_OBJECT
 
public:
StartDialog(QWidget* pwgt = 0);
 
public slots:
void slotColor();
 
};
 
#endif  //_StartDialog_h_
 
Код
C++ (Qt)
#include "StartDialog.h"
#include <QtGui>
 
StartDialog::StartDialog(QWidget* pwgt) :
QWidget(pwgt)
{
QPushButton* pcmdColor = new QPushButton("&Color");
connect(pcmdColor, SIGNAL(clicked()), this, SLOT(slotColor()));
 
QVBoxLayout* pvbxLayout = new QVBoxLayout;
pvbxLayout->addWidget(pcmdColor);
 
setLayout(pvbxLayout);
}
 
void StartDialog::slotColor()
{
QColor color = QColorDialog::getColor(Qt::white);
 
QPushButton *btn = qobject_cast<QPushButton*>(sender());
if(btn && color.isValid())
{
QPalette palette = btn->palette();
palette.setColor(QPalette::Button, color);
palette.setColor(QPalette::Light, color.lighter());
palette.setColor(QPalette::Dark, color.darker());
btn->setPalette(palette);
}
}
 


Название: Re: Динамический цвет кнопки.
Отправлено: Brono от Август 06, 2016, 00:51
А так: ...

Тоже не работает. Версия Qt -- 5.3 GCC, платформа -- Ubuntu 14.04 32bit.

UPD: Попробовал на Win7+MinGW+Qt 5.6|5.7, не вышло.


Название: Re: Динамический цвет кнопки.
Отправлено: Brono от Август 06, 2016, 01:19
используйте QString QColor::name(NameFormat format) const для получения строки цвета

Спасибо, не знал.


Название: Re: Динамический цвет кнопки.
Отправлено: VPS от Август 06, 2016, 09:25
А так: ...

Тоже не работает. Версия Qt -- 5.3 GCC, платформа -- Ubuntu 14.04 32bit.

UPD: Попробовал на Win7+MinGW+Qt 5.6|5.7, не вышло.
Очень странно...
Проверял на Windows 7 + Qt4.8.7 (Qt 5.6). Цвет кнопки исправно меняется. ???
Или может я не понял суть вопроса?


Название: Re: Динамический цвет кнопки.
Отправлено: Brono от Август 06, 2016, 20:10
Проверял на Windows 7 + Qt4.8.7 (Qt 5.6).

Возможно, я должен добавить, что в том виде, в котором здесь была реализация, оно не сработало. Ругалось на отсутствие QPushButton, QVBoxLayout и остальных стандартных виджетов. В заголовочном файле приишлось поменять <QWidget> на <QtWidgets>. И оно заработало.


Название: Re: Динамический цвет кнопки.
Отправлено: lit-uriy от Август 06, 2016, 20:42
Оно НЕ "Не сработало", а не компилировалось. Это принципиально разные ситуации