【发布时间】:2016-08-31 08:20:32
【问题描述】:
我正在为 Qt5 中的 SQLite 数据库开发 GUI。我使用QSqlQueryModel 和QTableView 来存储和显示数据。
然后我创建了一个自定义委托,使用 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) 语句中添加了附加代码,该语句根据其选择状态绘制单元格。因此,如果未选中,则文本为黑色,如果选中,则文本变为白色,背景变为蓝色。但是,我仍然无法让列扩展以适应单元格的内容,或者在单元格外部添加一条虚线,就像使用标准委托一样。
在使用我的自定义绘制方法时,有没有一种简单的方法可以保持表格视图的默认样式?
【问题讨论】:
-
你能提供你委托的代码吗?
-
里面的代码不多。它覆盖了委托的绘制方法,在方法主体内是: if (index.column() ==3) {// switch 语句 //painter->drawText(option.rect, literalStr);} else { return QStyledItemDelegate: :paint(painter, option, index)
-
如果您只想用字符串值替换数字值以进行显示,您是否考虑过保留默认委托并插入代理模型?您可以继承
QIdentityProxyModel并覆盖其data()方法,这可能就是您所需要的。 -
我没有考虑代理,没有。我是 Qt5 的新手,看到星型委托示例与我想做的事情(更改模型数据在表格中的显示)有点相似,因此我将其用作起点。基本上,我的代表将
ints 更改为QStrings,就像上面一样,并使用QString.setNum(double, 'f', decimals)设置双打的小数位数。从您的评论看来,代理模型可以做同样的事情,但要保持标准委托。它是否正确?如果是这样,您能否指出一个覆盖代理模型的data()方法的示例?
标签: qt qt5 qstyleditemdelegate