2015-05-08 36 views
1

我有一个QTabWidget,每个选项卡都包含一个QTableView。 tableviews使用QTableModels从sqlite数据库读取数据。QTabWidget里面的QTableView不显示数据

模型保存为成员变量,所以我不认为这是一个范围问题(这是我通过搜索问题找到的最常见问题)。

其他数据库操作的工作原理:我试着在代码中填充/创建表,并且正确执行这些操作。

下面是类定义:

#include <QMainWindow> 
#include <QtSql> 
#include <QString> 

namespace Ui { 
    class MainWindow; 
} 

class AlisnagMainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit AlisnagMainWindow(QWidget *parent = 0); 
    ~AlisnagMainWindow(); 

protected: 
    bool createDB(const QString& filename); 
    bool loadDB(const QString& filename); 

protected slots: 
    void newFile(); 
    void openFile(); 
    void addRow(); 

private: 
    void initModels(); 
    Ui::MainWindow *ui; 
    QSqlDatabase db; 
    QSqlRelationalTableModel *loans_model; 
    QSqlTableModel    *people_model; 
    QSqlRelationalTableModel *items_model; 
}; 

这是构造:

AlisnagMainWindow::AlisnagMainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow), 
    loans_model(new QSqlRelationalTableModel(this)), 
    people_model(new QSqlTableModel(this)), 
    items_model(new QSqlRelationalTableModel(this)) 
{ 
    ui->setupUi(this); 

    db = QSqlDatabase::addDatabase("QSQLITE"); 

    connect(ui->actionNew, SIGNAL(triggered()), this, SLOT(newFile())); 
    connect(ui->actionOpen, SIGNAL(triggered()), this, SLOT(openFile())); 
} 

这是我的初始化模型和视图:

void AlisnagMainWindow::initModels(){ 
    people_model->setTable("people"); 
    people_model->setEditStrategy(QSqlTableModel::OnRowChange); 
    people_model->select(); 
    people_model->setHeaderData(0, Qt::Horizontal, tr("Name")); 
    people_model->setHeaderData(1, Qt::Horizontal, tr("Surname")); 
    people_model->setHeaderData(2, Qt::Horizontal, tr("Phone")); 
    people_model->setHeaderData(3, Qt::Horizontal, tr("Address")); 

    items_model->setTable("items"); 
    items_model->setEditStrategy(QSqlTableModel::OnRowChange); 
    items_model->setRelation(3, QSqlRelation("categories","id","name")); 
    items_model->select(); 

    loans_model->setTable("loans"); 
    loans_model->setEditStrategy(QSqlTableModel::OnRowChange); 
    loans_model->setRelation(0, QSqlRelation("items","id","name")); 
    loans_model->setRelation(1, QSqlRelation("people","id","name")); 
    loans_model->select(); 

    ui->peopleView->setModel(people_model); 
    ui->peopleView->hideColumn(0); 

    ui->itemsView->setModel(items_model); 
    ui->itemsView->hideColumn(0); 

    ui->loansView->setModel(loans_model); 
    ui->loansView->hideColumn(0); 

} 

数据库加载如下:

bool AlisnagMainWindow::loadDB(const QString &filename) 
{ 
    if(db.isOpen()) 
     db.close(); 
    db.setDatabaseName(filename); 

    if(!db.open()){ 
     QMessageBox::critical(this, tr("Error"), 
           tr("Could not open db %1").arg(filename), 
           QMessageBox::Ok); 
     return false; 
    } 

    ui->statusBar->showMessage("DB successfully opened!"); 
    return true; 

} 

那么这就是如何将所有的合并:

void AlisnagMainWindow::openFile() 
{ 
    QString filename = QFileDialog::getOpenFileName(this, tr("Choose DB file"), 
                ".", "*.db"); 
    loadDB(filename); 

    initModels(); 
} 

文件我开业以来,一直在外部填充。当我运行代码时,数据和头文件都不显示。任何见解?

在此先感谢。

编辑:添加一些方面的要求

+0

不完整的信息。如果你想让人们帮助你进行调试,那么不要只是抛出一些你认为它们可能包含问题的**的函数。 – Greenflow

+0

说实话,这是迄今为止我所拥有的一切,我唯一没有提到的是构造函数和类定义。前者初始化成员变量,没什么更多的。后者只包含成员定义,应该如此。 无论如何,抱歉,如果它不够详细:直到现在,我从来不需要直接帮助,我总是通过搜索找到解决方案,所以这是我第一次直接发布求助。 – asanf

+0

现在看起来好多了。所以,我不确定这部分,但值得一试。你创建你的模型:loans_model(新的QSqlRelationalTableModel(this))。根据文档:如果你不在第二个参数中提供数据库,使用默认数据库。但是什么默认的分贝?稍后在构造函数中添加db。我不认为(猜测)这个神奇地被追溯传递给你的模型......所以你的模型可能不适用于你的sqlite数据库。 – Greenflow

回答

1

由于Greenflow指出,问题是在构造函数中,特别是在初始化的顺序。
构造函数修改如下

AlisnagMainWindow::AlisnagMainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow), 
    db (QSqlDatabase::addDatabase("QSQLITE")), 
    loans_model(new QSqlRelationalTableModel(this, db)), 
    people_model(new QSqlTableModel(this, db)), 
    items_model(new QSqlRelationalTableModel(this, db)) 
{ 
    ui->setupUi(this); 
    connect(ui->actionNew, SIGNAL(triggered()), this, SLOT(newFile())); 
    connect(ui->actionOpen, SIGNAL(triggered()), this, SLOT(openFile())); 
} 
+0

你应该接受这个答案,以明确你的问题解决了 – Erik