Qt5で3つの状態により背景色を変えて見せるQLabel派生の自作ウィジェットを作成しました。
ざっと次のようになります。
c++
1#include <QLabel> 2 3class StatusIndicator : public QLabel 4{ 5Q_OBJECT 6public: 7 enum class Status { 8 Unknown, // 不明 9 Normal, // 正常 10 Error // 異常 11 }; 12 13public: 14 explicit StatusIndicator(const Status &initStatus = Status::Unknown, QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()); 15 16 Status status(); 17 void setStatus(const Status &status); // 状態が変わったら背景色も変えたい。色はクライアントに任意にしたい 18 19private: 20 Status _status{Status::Unknown}; 21 22private: 23 24 QString generateText(const Status &status); 25}; 26
現時点、3つの状態に対応するbackgroud-colorはハードコーディングで決め打ちです。これだといまいちなので改良しようと考えています。
改良として、このクラスを利用する側(クライアントと呼びます)に任意として、状態に対応する背景色をそれぞれ設定できるようにしたいのですが、その方法がわかりません。
(1) 自作ウィジェットにQt5スタイルシートで認識できる独自属性を設けることはできるのでしょうか?できるとして、どうすれば良いのでしょうか?
(2) 独自属性の値(先述のクラスであればNormal/Error)に基づきbackground-colorを変更する方法はないものでしょうか。
イメージとしては、次のように背景色の変更ができるようにしたいです。
c++
1auto label = StatusIndicator(StatusIndicator::Status::Normal, this); 2// StatusIndicatorのstatus属性がNormalの時は背景をLime色にしたい 3label->setStyleSheet("StatusIndicator::_status:Normal {background-color: Lime;"}); 4// StatusIndicatorのstatus属性がErrorの時は背景をOrangeRed色にしたい 5label->setStyleSheet("StatusIndicator::_status:Error {background-color: OrangeRed;"}); 6/* 7 * (補足)このコードでは色を変更することができません 8 */
念の為コードを掲載しておきます。
c++
1#include <QtGlobal> 2 3#include "GStatusIndicator.h" 4 5 6GStatusIndicator::GStatusIndicator(const Status &initStatus, QWidget *parent, Qt::WindowFlags f) 7 :QLabel(generateText(initStatus), parent, f) 8{ 9 setFrameShape(QFrame::Panel); 10 setFrameShadow(QFrame::Sunken); 11} 12 13GStatusIndicator::Status GStatusIndicator::status() 14{ 15 return _status; 16} 17 18/* 19 * 背景色が固定で変更できないのはいまいち 20 */ 21void GStatusIndicator::setStatus(const Status &status) 22{ 23 if (status != _status) 24 { 25 _status = status; 26 setText(generateText(_status)); // 正常 or 異常 or 不明 27 28 switch (_status) 29 { 30 case Status::Normal: 31 { 32 setStyleSheet("background-color: lime;"); 33 break; 34 } 35 36 case Status::Error: 37 { 38 setStyleSheet("background-color: OrangeRed;"); 39 break; 40 } 41 42 default: 43 { 44 setStyleSheet("background-color: lightgrey;"); 45 break; 46 } 47 } 48 } 49} 50 51QString GStatusIndicator::generateText(const Status &status) 52{ 53 switch (status) 54 { 55 case Status::Unknown: 56 return {"不明"}; 57 58 case Status::Normal: 59 return {"正常"}; 60 61 case Status::Error: 62 return {"異常"}; 63 64 default: 65 Q_ASSERT_X(false, __func__, QString("Invalid status=%1").arg(static_cast<int>(status)).toStdString().c_str()); 66 break; 67 } 68}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/27 23:34