我有一個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();
}
文件我開業以來,一直在外部填充。當我運行代碼時,數據和頭文件都不顯示。任何見解?
在此先感謝。
編輯:添加一些方面的要求
不完整的信息。如果你想讓人們幫助你進行調試,那麼不要只是拋出一些你認爲它們可能包含問題的**的函數。 – Greenflow
說實話,這是迄今爲止我所擁有的一切,我唯一沒有提到的是構造函數和類定義。前者初始化成員變量,沒什麼更多的。後者只包含成員定義,應該如此。 無論如何,抱歉,如果它不夠詳細:直到現在,我從來不需要直接幫助,我總是通過搜索找到解決方案,所以這是我第一次直接發佈求助。 – asanf
現在看起來好多了。所以,我不確定這部分,但值得一試。你創建你的模型:loans_model(新的QSqlRelationalTableModel(this))。根據文檔:如果你不在第二個參數中提供數據庫,使用默認數據庫。但是什麼默認的分貝?稍後在構造函數中添加db。我不認爲(猜測)這個神奇地被追溯傳遞給你的模型......所以你的模型可能不適用於你的sqlite數據庫。 – Greenflow