2015-05-08 73 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