void MyWindow::initializeModelBySQL(QSqlQueryModel *model,QTableView *table,QString sql){
model = new QSqlQueryModel(this);
model->setQuery(sql);
}
使用这种方法,我可以为我的 QTableviews 设置一个 QSQlQueryModels。
但是我如何根据单元格值将颜色设置为一行?
void MyWindow::initializeModelBySQL(QSqlQueryModel *model,QTableView *table,QString sql){
model = new QSqlQueryModel(this);
model->setQuery(sql);
}
使用这种方法,我可以为我的 QTableviews 设置一个 QSQlQueryModels。
但是我如何根据单元格值将颜色设置为一行?
Qt::BackgroundRole
视图根据单元格的角色绘制背景,该角色是该角色QBrush
返回的值QAbstractItemModel::data(index, role)
。
您可以子类化QSqlQueryModel
以重新定义data()
以返回您计算的颜色,或者如果您的 Qt > 4.8,您可以使用QIdentityProxyModel
:
class MyModel : public QIdentityProxyModel
{
QColor calculateColorForRow(int row) const {
...
}
QVariant data(const QModelIndex &index, int role)
{
if (role == Qt::BackgroundRole) {
int row = index.row();
QColor color = calculateColorForRow(row);
return QBrush(color);
}
return QIdentityProxyModel::data(index, role);
}
};
并在视图中使用该模型,并将 sql 模型设置为带有QIdentityProxyModel::setSourceModel
.
您可以保持模型不变,并使用在视图上设置的委托修改背景QAbstractItemView::setItemDelegate
:
class BackgroundColorDelegate : public QStyledItemDelegate {
public:
BackgroundColorDelegate(QObject *parent = 0)
: QStyledItemDelegate(parent)
{
}
QColor calculateColorForRow(int row) const;
void initStyleOption(QStyleOptionViewItem *option,
const QModelIndex &index) const
{
QStyledItemDelegate::initStyleOption(option, index);
QStyleOptionViewItemV4 *optionV4 =
qstyleoption_cast<QStyleOptionViewItemV4*>(option);
optionV4->backgroundBrush = QBrush(calculateColorForRow(index.row()));
}
};
由于从 C++ 代码转换最后一种方法并不总是显而易见的,因此这里是 python 中的等效方法:
def initStyleOption(self, option, index):
super(BackgroundColorDelegate,self).initStyleOption(option, index)
option.backgroundBrush = calculateColorForRow(index.row())
您最好的选择是定义一个自定义模型(QAbstractTableModel
子类)。您可能希望QSqlQueryModel
在这个自定义类中有一个成员。
如果是只读模型,则至少需要实现以下方法:
int rowCount(const QModelIndex &parent) const;
int columnCount(const QModelIndex &parent) const;
QVariant data(const QModelIndex &index, int role) const;
对于表现良好的模型也
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
如果您需要模型能够编辑/提交数据,事情会涉及更多,您还需要实现这些方法:
Qt::ItemFlags flags(const QModelIndex &index) const;
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole);
bool insertRows(int position, int rows, const QModelIndex &index=QModelIndex());
bool removeRows(int position, int rows, const QModelIndex &index=QModelIndex());
实际上会改变行外观的在于此方法的返回值:
QVariant data(const QModelIndex &index, int role) const;
一个愚蠢的例子:
QVariant MyCustomModel::data(const QModelIndex &index, int role) const
{
if ( !index.isValid() )
return QVariant();
int row = index.row();
int col = index.column();
switch ( role )
{
case Qt::BackgroundRole:
{
if(somecondition){
// background for this row,col is blue
return QVariant(QBrush (QColor(Qt::blue)));
}
// otherwise background is white
return QVariant(QBrush (QColor(Qt::white)));
}
case Qt::DisplayRole:
{
// return actual content for row,col here, ie. text, numbers
}
case Qt::TextAlignmentRole:
{
if (1==col)
return QVariant ( Qt::AlignVCenter | Qt::AlignLeft );
if (2==col)
return QVariant ( Qt::AlignVCenter | Qt::AlignTrailing );
return QVariant ( Qt::AlignVCenter | Qt::AlignHCenter );
}
}
}