這次所做的項目中需要用到如下功能,點擊tableWidget中的子項,將會彈出顏色選值對話框,實現子項的改變,如下圖所示:

1、首先,將自己定制的調色板放入tableWidget中
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
myPushButton = new MyQPushButton(this);
ui.tableWidget->setCellWidget(i, j, myPushButton); //插入第i行,j列
}
}
2、頭文件
#pragma once #include <QObject> #include <QPushButton> #include <QColorDialog> #include <QMouseEvent> class MyQPushButton : public QPushButton //公有繼承QPushButton { Q_OBJECT public: MyQPushButton(QWidget *parent); ~MyQPushButton();
void setColor();//設置隨機顏色 void setColor(QColor color);//設置特定顏色 QColor getColor() const;//獲取顏色 private slots: void choiceColor(void); //方法一,通過信號與槽連接 protected: void mousePressEvent(QMouseEvent *event); //方法二、通過重寫鼠標按下事件 };
3、源文件
#include "MyQPushButton.h"
MyQPushButton::MyQPushButton(QWidget *parent): QPushButton(parent) { //connect(this, SIGNAL(clicked()), this, SLOT(choiceColor(void))); //方法1 /*下面兩行代碼必須有,否則效果會有差異*/ setAutoFillBackground(true); //設置自動填充背景 setFlat(true); //設置成平面 } MyQPushButton::~MyQPushButton() { } /*點擊本身響應的槽函數*/ void MyQPushButton::choiceColor(void) { QColor color = QColorDialog::getColor(Qt::white, this); //調出顏色選擇器對話框 QPalette pal; //此類包含每個小部件狀態的顏色組 pal.setColor(QPalette::Button, color); //QPalette::Button, ColorRole enum定義了當前gui中使用的不同符號顏色角色。 setPalette(pal); } /*鼠標按下事件*/ void MyQPushButton::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { QPalette pal; pal.setColor(QPalette::Button, QColorDialog::getColor()); this->setPalette(pal); } } /*設置隨機顏色*/ void MyQPushButton::setColor() { QColor color(rand() % 256, rand() % 256, rand() % 256);//產生一組隨機的rgb值 QPalette pal; pal.setColor(QPalette::Button, color); setPalette(pal); } /*設置給定的顏色*/ void MyQPushButton::setColor(QColor color) { QPalette pal; pal.setColor(QPalette::Button, color); setPalette(pal); } /*獲取當前顏色*/ QColor MyQPushButton::getColor() const { return this->palette().color(QPalette::Button); }
4、獲取當前按鈕的顏色。
QColor theColor=((MyQPushButton*)ui.tableWidget->cellWidget(i, j))->palette().color(QPalette::Button);//cellWidget(i, j)的返回值是QWidget*,所以一定要注意使用MyQPushButton*進行類的強制轉化(不能使用MyQPushButton)。
補充:獲取顏色列表,可參考:https://blog.csdn.net/rl529014/article/details/51589096
