每当我使用以下方法更改行中的数据时,我的QTableView显示一个额外的空行有问题:
beginInsertRows(QModelIndex(), rowCount(), rowCount());
listOfObjects.replace(i, *object);
endInsertRows();
我把它改成了这个,但是看起来非常hacky。
beginRemoveRows(QModelIndex(), rowCount(), rowCount());
beginInsertRows(QModelIndex(), rowCount(), rowCount());
listOfObjects.replace(i, *object);
endInsertRows();
endRemoveRows();
有没有更好的方法来实现这一目标?
由于
答案 0 :(得分:1)
这是一个简单的例子。 让我们创建一个自定义表模型:
class MyModel : public QAbstractTableModel
{
Q_OBJECT
public:
explicit MyModel(int rows, int cols, QObject *parent = 0);
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
void updateRow(int row);
private:
int m_rows, m_cols;
QMap<int, QMap<int, QString> > updatedItems;
};
它具有updateRow
功能,可将项目文本从“清除”更改为“更新”和QMap
更新项目。
MyModel::MyModel(int rows, int cols, QObject *parent) :
QAbstractTableModel(parent),
m_rows(rows),
m_cols(cols)
{
}
int MyModel::rowCount(const QModelIndex &parent) const
{
return m_rows;
}
int MyModel::columnCount(const QModelIndex &parent) const
{
return m_cols;
}
QVariant MyModel::data(const QModelIndex &index, int role) const
{
QVariant res;
if (role == Qt::DisplayRole)
{
int row = index.row();
int col = index.column();
QString text;
if (updatedItems.contains(row))
{
QMap<int, QString> colData = updatedItems.value(row);
if (colData.contains(col))
{
text = colData.value(col);
}
}
if (text.isEmpty())
{
text = QString("clean %1 - %2").arg(row).arg(col);
}
res = text;
}
return res;
}
void
MyModel::updateRow(int row)
{
if (updatedItems.contains(row) == false)
{
updatedItems[row] = QMap<int, QString>();
}
for (int col = 0; col < m_cols; ++col)
{
QString text = QString("update %1 - %2").arg(row).arg(col);
updatedItems[row].insert(col, text);
}
QModelIndex index1 = index(row, 0);
QModelIndex index2 = index(row, m_cols - 1);
emit dataChanged(index1, index2);
}
检查最后一个函数发出dataChanged
信号的方式。
以下是您可以使用该模型的方法:
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QVBoxLayout *layout = new QVBoxLayout(this);
QPushButton *btn = new QPushButton("update");
view = new QTableView;
model = new MyModel(4, 5, view);
view->setModel(model);
layout->addWidget(btn);
layout->addWidget(view);
connect(btn, SIGNAL(clicked()), this, SLOT(updateRowData()));
resize(400, 300);
}
void Widget::updateRowData()
{
QModelIndex index = view->currentIndex();
if (index.isValid())
{
int row = index.row();
model->updateRow(row);
}
}