QSqlTableModel 和 QSQLITE 未显示正确的列 & header
QSqlTableModel and QSQLITE not showing correct columns & header
在用户界面上,我有一个 QTableView
在第一次启动后的最开始看起来像这样:
一旦用户 运行 项目并创建一个新数据库 .db
(假设用户将 .db 文件放在桌面上),这个 QTableView
看起来像这样正确的行为:
问题: 在我开始保存图像及其路径后,所有 headers 都带有不同的名称 (1,2,3,4) 而不是 (path1, path2, image1, image2) 如前所示,缺少 id
列,如下所示,这是 错误行为 :
下面是我如何设置最重要的参数:
mainwindow.h
private:
QString temporaryFolder;
dataInfo *mNewDatabaseImages;
QSqlTableModel *mNewTableImages;
QStandardItemModel *model;
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
temporaryFolder = "/home/path/toDesktop/folder/a.db";
QFile dbRem(temporaryFolder);
dbRem.remove();
mNewDatabaseImages = new dataInfo(this);
mNewDatabaseImages->initDataBase(temporaryFolder);
mNewDatabaseImages->confDataBase();
mNewTableImages = new QSqlTableModel(this, mNewDatabaseImages->getDatabase());
mNewTableImages->setTable("imageTable");
mNewTableImages->select();
ui->bookMarkTableView->setModel(mNewTableImages);
model = new QStandardItemModel();
ui->bookMarkTableView->setModel(model);
ui->bookMarkTableView->showColumn(true);
}
除此之外,用户界面上还有两个图标,可用于打开现有数据库或创建新数据库,如下所示:
这部分也在 mainwindow.cpp 上,下面是代码片段:
void MainWindow::openDatabase(MainWindow::Opening opening)
{
QString nameDatabase;
if(opening == OPENING) {
nameDatabase = QFileDialog::getOpenFileName(this,
"Open Database", QDir::rootPath(),
"Database (*.db);;Any type (*.*)");
} else {
nameDatabase = QFileDialog::getSaveFileName(this,
"New Database", QDir::rootPath(),
"Database (*.db);;Any type (*.*)");
}
if(nameDatabase.isEmpty()) {
return;
}
if(!mNewDatabaseImages->initDataBase(nameDatabase)) {
QMessageBox::critical(this, "Error", mNewDatabaseImages->getError());
return;
}
if(!mNewDatabaseImages->confDataBase()) {
QMessageBox::critical(this, "Error", mNewDatabaseImages->getError());
return;
}
delete mNewTableImages;
// Work with the database file created
mNewTableImages = new QSqlTableModel(this, mNewDatabaseImages->getDatabase());
mNewTableImages->setTable("imageTable");
mNewTableImages->select();
ui->bookMarkTableView->setModel(mNewTableImages);
ui->bookMarkTableView->showColumn(true);
}
我使用的数据库是QSQLITE
,SQL
的写法是,如果有需要也可以看一下。
为什么 QTableView
没有显示正确的 headers 和列?
感谢您指出正确的方向。
那是因为你用新的QStandardItemModel
覆盖了它,所以每次程序运行时所有的headers都会消失。尝试通过以下方式注释掉最后三行来修改构造函数:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
temporaryFolder = "/home/path/toDesktop/folder/a.db";
QFile dbRem(temporaryFolder);
dbRem.remove();
mNewDatabaseImages = new dataInfo(this);
mNewDatabaseImages->initDataBase(temporaryFolder);
mNewDatabaseImages->confDataBase();
mNewTableImages = new QSqlTableModel(this, mNewDatabaseImages->getDatabase());
mNewTableImages->setTable("imageTable");
mNewTableImages->select();
ui->bookMarkTableView->setModel(mNewTableImages);
// In this way you don't overwrite your initial headers
// model = new QStandardItemModel();
// ui->bookMarkTableView->setModel(model);
// ui->bookMarkTableView->showColumn(true);
}
在用户界面上,我有一个 QTableView
在第一次启动后的最开始看起来像这样:
一旦用户 运行 项目并创建一个新数据库 .db
(假设用户将 .db 文件放在桌面上),这个 QTableView
看起来像这样正确的行为:
问题: 在我开始保存图像及其路径后,所有 headers 都带有不同的名称 (1,2,3,4) 而不是 (path1, path2, image1, image2) 如前所示,缺少 id
列,如下所示,这是 错误行为 :
下面是我如何设置最重要的参数:
mainwindow.h
private:
QString temporaryFolder;
dataInfo *mNewDatabaseImages;
QSqlTableModel *mNewTableImages;
QStandardItemModel *model;
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
temporaryFolder = "/home/path/toDesktop/folder/a.db";
QFile dbRem(temporaryFolder);
dbRem.remove();
mNewDatabaseImages = new dataInfo(this);
mNewDatabaseImages->initDataBase(temporaryFolder);
mNewDatabaseImages->confDataBase();
mNewTableImages = new QSqlTableModel(this, mNewDatabaseImages->getDatabase());
mNewTableImages->setTable("imageTable");
mNewTableImages->select();
ui->bookMarkTableView->setModel(mNewTableImages);
model = new QStandardItemModel();
ui->bookMarkTableView->setModel(model);
ui->bookMarkTableView->showColumn(true);
}
除此之外,用户界面上还有两个图标,可用于打开现有数据库或创建新数据库,如下所示:
这部分也在 mainwindow.cpp 上,下面是代码片段:
void MainWindow::openDatabase(MainWindow::Opening opening)
{
QString nameDatabase;
if(opening == OPENING) {
nameDatabase = QFileDialog::getOpenFileName(this,
"Open Database", QDir::rootPath(),
"Database (*.db);;Any type (*.*)");
} else {
nameDatabase = QFileDialog::getSaveFileName(this,
"New Database", QDir::rootPath(),
"Database (*.db);;Any type (*.*)");
}
if(nameDatabase.isEmpty()) {
return;
}
if(!mNewDatabaseImages->initDataBase(nameDatabase)) {
QMessageBox::critical(this, "Error", mNewDatabaseImages->getError());
return;
}
if(!mNewDatabaseImages->confDataBase()) {
QMessageBox::critical(this, "Error", mNewDatabaseImages->getError());
return;
}
delete mNewTableImages;
// Work with the database file created
mNewTableImages = new QSqlTableModel(this, mNewDatabaseImages->getDatabase());
mNewTableImages->setTable("imageTable");
mNewTableImages->select();
ui->bookMarkTableView->setModel(mNewTableImages);
ui->bookMarkTableView->showColumn(true);
}
我使用的数据库是QSQLITE
,SQL
的写法是
为什么 QTableView
没有显示正确的 headers 和列?
感谢您指出正确的方向。
那是因为你用新的QStandardItemModel
覆盖了它,所以每次程序运行时所有的headers都会消失。尝试通过以下方式注释掉最后三行来修改构造函数:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
temporaryFolder = "/home/path/toDesktop/folder/a.db";
QFile dbRem(temporaryFolder);
dbRem.remove();
mNewDatabaseImages = new dataInfo(this);
mNewDatabaseImages->initDataBase(temporaryFolder);
mNewDatabaseImages->confDataBase();
mNewTableImages = new QSqlTableModel(this, mNewDatabaseImages->getDatabase());
mNewTableImages->setTable("imageTable");
mNewTableImages->select();
ui->bookMarkTableView->setModel(mNewTableImages);
// In this way you don't overwrite your initial headers
// model = new QStandardItemModel();
// ui->bookMarkTableView->setModel(model);
// ui->bookMarkTableView->showColumn(true);
}