【问题标题】:QTableView inside QTabWidget does not show dataQTabWidget里面的QTableView不显示数据
【发布时间】:2015-05-08 14:37:14
【问题描述】:

我有一个QTabWidget,每个选项卡都包含一个QTableView。 tableviews 使用 QTableModels 从 sqlite 数据库中读取数据。

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

其他数据库操作有效:我尝试在代码中填充/创建表,并且这些操作已正确执行。

以下是类定义:

#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();
}

我打开的文件已在外部填充。当我运行代码时,既不显示数据也不显示标题。有什么见解吗?

提前致谢。

编辑:根据要求添加了一些上下文

【问题讨论】:

  • 信息不完整。如果您希望人们帮助您调试,请不要只在某些上下文中添加较少的函数,这些函数您认为它们可能包含问题。
  • 老实说,这就是我目前所拥有的一切,我唯一没有放在这里的是构造函数和类定义。前者初始化成员变量,仅此而已。后者只包含成员定义,因为它应该。无论如何,如果不够详细,抱歉:直到现在我都不需要直接帮助,我总是通过搜索找到解决方案,所以这是我第一次直接发帖寻求帮助。
  • 现在看起来好多了。所以,我不确定这部分,但值得一试。你创建你的模型:loans_model(new QSqlRelationalTableModel(this))。根据文档:如果您未在第二个参数中提供 db,则使用默认 db。但是什么默认数据库?您稍后在构造函数中添加数据库。我不认为(推测)这会神奇地追溯传递给您的模型......所以您的模型可能不适用于您的 sqlite 数据库。
  • 我将“玩”初始化,要么解决问题并修改帖子,要么回来寻求帮助。感谢您的见解。

标签: c++ qt sqlite qtableview qtabwidget


【解决方案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()));
}

【讨论】:

  • 你应该接受这个答案来明确你的问题已经解决了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 2021-12-22
  • 1970-01-01
相关资源
最近更新 更多