参考:
C++ GUI Programming with Qt 4, Second Edition
本地环境:
win10专业版,64位,Qt5.12
效果
填充一个列表,在列表中点击“颜色”一列,可以选择颜色。
代码
头文件
增加一个私有变量和一个槽函数:
private:
// 填充features页面,特征类型table
void setFeaturesTableWidget();
int featuresColorColIdx = 3; // 点击颜色列才能调出调色盘
private slots:
// 这个格式的槽函数不用再写connect,是默认连接的
void on_featuresTableWidget_cellClicked(int row, int col);
源文件
void PreferenceDialog::setFeaturesTableWidget() {
QStringList featureNamesList = {}; // 放一些字符串,这里省略
QStringList featureTypesList = {}; // 同上
QStringList featureIsTransList = {}; // 同上
QMap<QString, QColor> map = {{"promoter", QColor("#CB4335")}, ... }; // 省略内容
int length = featureNamesList.length();
// 设置行数,否则不显示内容
featuresTableWidget->setRowCount(length);
// 设置列宽
featuresTableWidget->setColumnWidth(3, 50);
for (int i = 0; i < length; i++) {
QString actualName = featureNamesList[i];
QTableWidgetItem* name = new QTableWidgetItem(actualName);
QTableWidgetItem* type = new QTableWidgetItem(featureTypesList[i]);
QTableWidgetItem* isTrans = new QTableWidgetItem(featureIsTransList[i]);
featuresTableWidget->setItem(i, 0, name);
featuresTableWidget->setItem(i, 1, type);
featuresTableWidget->setItem(i, 2, isTrans);
// 设置颜色按钮
QColor color;
QTableWidgetItem *item = new QTableWidgetItem();
if (map.contains(actualName)) {
color = map[actualName];
} else {
// 找不到的暂时用浅灰色
color = QColor(Qt::lightGray);
}
item->setBackgroundColor(color);
featuresTableWidget->setItem(i, 3, item);
}
}
void PreferenceDialog::on_featuresTableWidget_cellClicked(int row, int col)
{
// 只有点击了颜色列的单元格才可以打开颜色对话框
if (col == featuresColorColIdx) {
// 打开颜色对话框,选择颜色
QColor color = QColorDialog::getColor();
if (color.isValid()) {
QTableWidgetItem *item = new QTableWidgetItem();
item->setBackgroundColor(color);
// 修改颜色
featuresTableWidget->setItem(row, col, item);
}
}
}
可能遇到的问题
只显示表头不显示内容
检查一下是不是没设置行数。
featuresTableWidget->setRowCount(length);