我有一个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