QTableView 不显示任何内容
QTableView doesn't show anything
我正在尝试用 QTableView
制作 window 的原型。它背后还没有任何数据库,但在某个时候会有。我无法让 tableview 显示任何内容。我得到一个白色的矩形 space。我查看了在线示例,据我所知似乎一切都正确。
我使用 GUI 构建器设置了一个 QTableView
对象,然后在调用 ui.setupUi(this);
后立即添加了以下代码
// set up prototype table model to hold dummy data
QSqlTableModel * model = new QSqlTableModel(this);
model->setTable("Errors");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
// set header names
model->setHeaderData(0, Qt::Horizontal, QObject::tr("Error Number"));
model->setHeaderData(1, Qt::Horizontal, QObject::tr("Message"));
model->setHeaderData(2, Qt::Horizontal, QObject::tr("Details"));
// insert a dummy record
{
QSqlRecord record;
QSqlField field1("Errno", QVariant::Int);
field1.setValue(1);
record.insert(0, field1);
QSqlField field2("Msg", QVariant::String);
field2.setValue(QString("Unable to perform snapshot"));
record.insert(1, field2);
QSqlField field3("Details", QVariant::String);
field3.setValue(QString("Unable to perform snapshot. Please try again"));
record.insert(2, field3);
model->insertRecord(0, record);
}
// insert a dummy record
{
QSqlRecord record;
QSqlField field1("Errno", QVariant::Int);
field1.setValue(1);
record.insert(0, field1);
QSqlField field2("Msg", QVariant::String);
field2.setValue(QString("Unable to perform snapshot"));
record.insert(1, field2);
QSqlField field3("Details", QVariant::String);
field3.setValue(QString("Unable to perform snapshot. Please try again"));
record.insert(2, field3);
model->insertRecord(1, record);
}
ui.errMsgsTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
ui.errMsgsTableView->setModel(model);
ui.errMsgsTableView->show();
有人有什么建议吗?我错过了什么?
您不能在没有数据库的情况下使用 QSqlTableModel
。作为一种快速解决方法,您可以将它连接到一个临时的内存中 sqlite table,它实际上可以在两个语句中创建。不过,对于原型制作,您可能应该使用 QStandardItemModel
。这是一个完整的例子:
// https://github.com/KubaO/Whosebugn/tree/master/questions/dummymodel-37577922
#include <QtWidgets>
template <typename T> QStandardItem * newItem(const T val) {
auto item = new QStandardItem;
item->setData(val, Qt::DisplayRole);
return item;
}
int main(int argc, char ** argv) {
QApplication app{argc, argv};
QStandardItemModel model;
model.setColumnCount(3);
model.setHorizontalHeaderLabels(QStringList{"Error Number", "Message", "Details"});
auto newRow = []{ return QList<QStandardItem*>{
newItem(1),
newItem("Unable to perform snapshot"),
newItem("Unable to perform snapshot. Please try again")};
};
model.appendRow(newRow());
model.appendRow(newRow());
QTableView view;
view.setModel(&model);
view.show();
return app.exec();
}
我正在尝试用 QTableView
制作 window 的原型。它背后还没有任何数据库,但在某个时候会有。我无法让 tableview 显示任何内容。我得到一个白色的矩形 space。我查看了在线示例,据我所知似乎一切都正确。
我使用 GUI 构建器设置了一个 QTableView
对象,然后在调用 ui.setupUi(this);
// set up prototype table model to hold dummy data
QSqlTableModel * model = new QSqlTableModel(this);
model->setTable("Errors");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
// set header names
model->setHeaderData(0, Qt::Horizontal, QObject::tr("Error Number"));
model->setHeaderData(1, Qt::Horizontal, QObject::tr("Message"));
model->setHeaderData(2, Qt::Horizontal, QObject::tr("Details"));
// insert a dummy record
{
QSqlRecord record;
QSqlField field1("Errno", QVariant::Int);
field1.setValue(1);
record.insert(0, field1);
QSqlField field2("Msg", QVariant::String);
field2.setValue(QString("Unable to perform snapshot"));
record.insert(1, field2);
QSqlField field3("Details", QVariant::String);
field3.setValue(QString("Unable to perform snapshot. Please try again"));
record.insert(2, field3);
model->insertRecord(0, record);
}
// insert a dummy record
{
QSqlRecord record;
QSqlField field1("Errno", QVariant::Int);
field1.setValue(1);
record.insert(0, field1);
QSqlField field2("Msg", QVariant::String);
field2.setValue(QString("Unable to perform snapshot"));
record.insert(1, field2);
QSqlField field3("Details", QVariant::String);
field3.setValue(QString("Unable to perform snapshot. Please try again"));
record.insert(2, field3);
model->insertRecord(1, record);
}
ui.errMsgsTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
ui.errMsgsTableView->setModel(model);
ui.errMsgsTableView->show();
有人有什么建议吗?我错过了什么?
您不能在没有数据库的情况下使用 QSqlTableModel
。作为一种快速解决方法,您可以将它连接到一个临时的内存中 sqlite table,它实际上可以在两个语句中创建。不过,对于原型制作,您可能应该使用 QStandardItemModel
。这是一个完整的例子:
// https://github.com/KubaO/Whosebugn/tree/master/questions/dummymodel-37577922
#include <QtWidgets>
template <typename T> QStandardItem * newItem(const T val) {
auto item = new QStandardItem;
item->setData(val, Qt::DisplayRole);
return item;
}
int main(int argc, char ** argv) {
QApplication app{argc, argv};
QStandardItemModel model;
model.setColumnCount(3);
model.setHorizontalHeaderLabels(QStringList{"Error Number", "Message", "Details"});
auto newRow = []{ return QList<QStandardItem*>{
newItem(1),
newItem("Unable to perform snapshot"),
newItem("Unable to perform snapshot. Please try again")};
};
model.appendRow(newRow());
model.appendRow(newRow());
QTableView view;
view.setModel(&model);
view.show();
return app.exec();
}