【问题标题】:QSqlTableModel and QSQLITE not showing correct columns & headerQSqlTableModel 和 SQLITE 未显示正确的列和标题
【发布时间】:2019-03-26 02:17:30
【问题描述】:

在用户界面上,我有一个QTableView,在第一次启动后一开始看起来像这样:

一旦用户运行项目并创建一个新数据库.db(假设用户将.db 文件放在桌面上),这个QTableView 看起来像这样,正确的行为

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

以下是我如何设置最重要的参数:

ma​​inwindow.h

private:
    QString temporaryFolder;
    dataInfo *mNewDatabaseImages;
    QSqlTableModel *mNewTableImages;
    QStandardItemModel *model;

ma​​inwindow.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);
}

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

这部分也在 ma​​inwindow.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);
}

我使用的数据库是QSQLITESQL 的写法是here,如果有需要的话也可以看看。

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

感谢您指出正确的方向。

【问题讨论】:

    标签: sql c++11 sqlite qt5 qtableview


    【解决方案1】:

    那是因为你用新的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);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 2015-04-20
      • 2016-05-16
      • 2016-06-29
      • 1970-01-01
      相关资源
      最近更新 更多