我有一个3列的表:{“扫描”、"Qty“、"Item"}。如果“已扫描”和"Qty“列值匹配,我将尝试突出显示特定的行。我看到一些帖子说要在以下几个方面实现它
数据( const QModelIndex &index,int角色)
我试图如下所示,只更改表行的背景色,但它似乎不像建议的那样工作:
QVariant TransitItemTableModel::data(const QModelIndex &index, int role) const
{
switch (role) {
case TableDataRow:
{
return table.at(index.row()).at(index.column());
}
case HeadingRow:
{
if (index.row() == 0) {
return true;
} else {
return false;
}
}
case Qt::BackgroundRole:
{
QBrush redBackground(Qt::green);
return redBackground;
}
default:
break;
}
return QVariant();
}我打电话给你
在下面的代码中发出dataChanged:
bool TransitItemTableModel::setData(const QModelIndex &index, const QVariant &value,
int role) {
if (!index.isValid() ||
index.row() < 0 || index.row() >= table.size())
return false;
QList<QString> list1 = value.value<QList<QString>>();
QVector<QString> list2 = list1.toVector();
table.replace(index.row(), list2);
emit dataChanged(index, index, {TableDataRow});
return true;
}为了获得更多信息,我定义了以下角色:
enum TableRoles {
TableDataRow = Qt::UserRole + 1,
HeadingRow
};关于QML代码,我使用以下代码作为Table.qml显示,下面的代码显示了使用此Table.qml的部分代码:
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
TableView {
id: root
anchors.fill: parent
clip: true
signal clicked(int row, int column)
property var columnWidths: [0.5, 0.5] // as fractions of parent width
// preferably overwrite this when using
columnWidthProvider: function (column) { return Math.max(parent.width * columnWidths[column], 1) }
delegate: Rectangle {
implicitHeight: text.implicitHeight
border.color: "#dddddd"
color: (heading==true)?"#dddddd":"white"
Text {
id: text
text: tabledata
width: parent.width
wrapMode: Text.Wrap
padding: 5
}
MouseArea{
anchors.fill: parent
onClicked: root.clicked(model.row, model.column)
}
}
}Rectangle {
color: "transparent"
Layout.fillWidth: true
Layout.preferredHeight: parent.height - 250
Components.Table {
model: _transitItemTableModelAPI
columnWidths: [0.2, 0.15, 0.65]
}
}发布于 2019-09-16 10:34:48
您应该测试索引的有效性:
if (index.isValid())
{
if (role == Qt::DisplayRole)
{
return QString("hello data");
}
else if (role == Qt::BackgroundRole)
{
return QColor(Qt::lightGray);
}
}除此之外,您的代码应该运行良好。你能看到你的数据值吗?您不应该返回数据,因为如果角色是Qt::DisplayRole,则不返回数据。你确定,你把你的模型和你的QTableView和setModel();连接起来了吗?
编辑:来自文档:
可选角色参数可用于指定实际修改了哪些数据角色。角色参数中的空向量意味着所有角色都应该被认为是修改的。角色参数中元素的顺序没有任何相关性。
emit dataChanged(index, index, {TableDataRow});不会更新BackgroundRole。
https://stackoverflow.com/questions/57954368
复制相似问题