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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамический цвет кнопки.  (Прочитано 8426 раз)
Brono
Гость
« : Август 04, 2016, 19:47 »

Доброго времени суток!

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

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

Смена CSS делает так, что кнопка становится нужного цвета только в нажатом состоянии.
« Последнее редактирование: Август 04, 2016, 20:34 от Brono » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Август 04, 2016, 19:52 »

Видимо нужно показать этот CSS?
Записан
Brono
Гость
« Ответ #2 : Август 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); // Устанавливаем цвет
}
 

Оно не работает. Точнее работает, но цветной кнопка становится только в зажатом состоянии.
« Последнее редактирование: Август 05, 2016, 22:39 от Brono » Записан
VPS
Гость
« Ответ #3 : Август 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);
}
 
« Последнее редактирование: Август 04, 2016, 22:29 от vps » Записан
Brono
Гость
« Ответ #4 : Август 05, 2016, 23:12 »

Решение с палитрами не сработало.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #5 : Август 05, 2016, 23:36 »

https://github.com/sintegrial/Qt5ExtLib/tree/master/src/qtgradienteditor

там есть QtColorButton
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Bepec
Гость
« Ответ #6 : Август 05, 2016, 23:39 »

1) ";" в QSSse поставьте. (ну просто положено там быть, хотя на работоспособность не влияет).
2) используйте QString QColor::name(NameFormat format) const для получения строки цвета.
Записан
VPS
Гость
« Ответ #7 : Август 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);
}
}
 
Записан
Brono
Гость
« Ответ #8 : Август 06, 2016, 00:51 »

А так: ...

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

UPD: Попробовал на Win7+MinGW+Qt 5.6|5.7, не вышло.
« Последнее редактирование: Август 06, 2016, 01:17 от Brono » Записан
Brono
Гость
« Ответ #9 : Август 06, 2016, 01:19 »

используйте QString QColor::name(NameFormat format) const для получения строки цвета

Спасибо, не знал.
Записан
VPS
Гость
« Ответ #10 : Август 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). Цвет кнопки исправно меняется. Непонимающий
Или может я не понял суть вопроса?
Записан
Brono
Гость
« Ответ #11 : Август 06, 2016, 20:10 »

Проверял на Windows 7 + Qt4.8.7 (Qt 5.6).

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

Сообщений: 3880


Просмотр профиля WWW
« Ответ #12 : Август 06, 2016, 20:42 »

Оно НЕ "Не сработало", а не компилировалось. Это принципиально разные ситуации
Записан

Юра.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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