QSqlTableModel和QSQLITE未显示正确的列和标题

时间:2019-03-26 02:17:31

标签: sql c++11 sqlite qt5 qtableview

在用户界面上,我有一个QTableView,它在初次启动后的最开始就像这样:

QTableView

用户运行项目并创建一个新数据库.db(例如,用户将.db文件放在桌面上)后,此QTableView如下所示,正确行为

Correct_QTableView

问题:我开始保存图像及其路径后,所有标头都带有不同的名称(1、2、3、4),而不是如先前所示的(path1,path2,image1,image2)并且缺少id列,如下所示,这是错误行为

wrong

下面是我设置最重要的参数的方法:

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);
}

除了用户界面上还有两个图标,我可以使用它们打开现有数据库或创建新数据库,如下所示:

icons

此部分也位于 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的写入方式为here

为什么QTableView没有显示正确的标题和列?

感谢您指向正确的方向。

1 个答案:

答案 0 :(得分:0)

那是因为您要用新的QStandardItemModel覆盖它,因此,每次程序运行时,所有标头都会消失。尝试通过以下方式注释掉最后三行来修改构造函数:

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);
}