我正在为 Qt5 中的 SQLite 数据库开发 GUI。我使用QSqlQueryModel
andQTableView
来存储和显示数据。
然后,我创建了一个自定义委托,使用 switch 语句将某些列的数值替换为表视图中的文字(例如 1 = "Hello", 2 = "World")。
委托按应有的方式显示数据并正常工作。但是,自定义委托绘制的列与默认的绘制方法相比具有不同的格式QStyledItemDelegate
。值在左上角而不是左中,更改后的列不再自动扩展列以显示完整值,并且列中的单元格在选择时不会变为蓝色或具有虚线轮廓。
我创建了这个示例程序:
#include <QApplication>
#include <QModelIndex>
#include <QPainter>
#include <QStandardItemModel>
#include <QStyledItemDelegate>
#include <QTableView>
class TestDelegate: public QStyledItemDelegate {
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index)
const Q_DECL_OVERRIDE
{
if (index.column() == 0) {
int value = index.model()->data(index, Qt::DisplayRole).toInt();
QString str;
switch (value) {
case 1:
str = "Hello0000";
break;
case 2:
str = "World0000";
break;
}
if (option.state.testFlag (QStyle::State_Selected)) {
painter->fillRect(option.rect, option.palette.highlight());
qApp->style()->drawItemText(painter, option.rect, option.displayAlignment, option.palette, true, str, QPalette::HighlightedText);
} else {
painter->drawText(option.rect, option.displayAlignment, str);
}
} else {
return QStyledItemDelegate::paint(painter, option, index);
}
}
};
int main(int argc, char **argv) {
QApplication app(argc, argv);
QStandardItemModel model(2, 2);
model.setHorizontalHeaderItem(0, new QStandardItem(QString("A")));
model.setHorizontalHeaderItem(1, new QStandardItem(QString("B")));
model.setData(model.index(0, 0, QModelIndex()), 1);
model.setData(model.index(1, 0, QModelIndex()), 2);
model.setItem(0, 1, new QStandardItem(QString("Hello")));
model.setItem(1, 1, new QStandardItem(QString("World0000")));
QTableView view;
view.setItemDelegate(new TestDelegate);
view.setModel(&model);
view.resizeColumnsToContents();
view.show();
app.exec();
}
options.displayAlignment
这通过添加到painter->drawText()
;来修复文本对齐。我还在if(option.state & QStyle::State_Selected)
根据其选择状态绘制单元格的语句中添加了附加代码。因此,如果未选中,则文本为黑色,如果选中,则文本变为白色,背景变为蓝色。但是,我仍然无法让列扩展以适应单元格的内容,或者在单元格外部添加一条虚线,就像使用标准委托一样。
使用我的自定义绘制方法时,是否有一种简单的方法可以保持表格视图的默认样式?