2015-09-05 95 views
0

我见过很多关于讨论类似问题的教程/解释, 但我弄不明白,如何将它应用到这种情况。从插槽访问qtableview qsqltablemodel

我是一个Qt/C++新手,并试图构建简单的GUI应用程序,连接到一个 SQLite数据库。我有UI形式,这是使用Qt Creator设计器构建的。

UI窗体包含连接到我的表的QTableView小部件 - 所有似乎都正常工作。

我也有一个按钮,它应该 - 最终 - 在表中添加一行。 我读过,我不应该运行“INSERT”查询,而是使用QSqlTableModel公开的方法。 不幸的是,我无法从插槽访问我的TableView数据模型。

这是我的代码:

1)mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QDebug> 
#include <QtSql> 
#include <QFileInfo> 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

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

private slots: 


    void on_pushButtonChange_clicked(); 

    void on_pushButtonAdd_clicked(); 

private: 
    Ui::MainWindow *ui; 
    QSqlDatabase db; 

}; 

#endif // MAINWINDOW_H 

2)的main.cpp

#include "mainwindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    MainWindow w; 
    w.show(); 

    return a.exec(); 

} 

3)mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    QString dbType = "QSQLITE"; 
    QString dbName = “my.db"; 
    QString dbTable = “myTable”; 

    db = QSqlDatabase::addDatabase(dbType); 
    db.setDatabaseName(dbName); 
    db.open(); 

    QSqlTableModel *model = new QSqlTableModel(this, db); 
    model->setTable(dbTable); 
    model->setEditStrategy(QSqlTableModel::OnManualSubmit); 
    model->select(); 

    ui->myTableView->setModel(model); 

} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::on_pushButtonAdd_clicked() 
{ 

    //This is just to show, that I want to access QSqlTableModel from here: 
    QSqlTableModel model = ui->myTableView->model(); 

} 

当我运行调试我收到以下错误消息:

错误:没有可行的从'QAbstractItemModel *'转换为'QSqlTableModel' QSqlTableModel model = ui-> myTableView-> model();

我明白这个问题 - 我知道我可以将QAbstractItemModel投射到SQLTableModel, ,但这似乎是一个比正确解决方案更好的解决方法。

请问您应该如何声明/定义/实例化我的对象, 以便我可以访问QSqlTableModel将数据从提到的插槽提供给我的TableView?

回答

0

您可以将模型保存为MainWindow成员数据并从插槽访问它,或者qobject_cast<QSqlTableModel*>(model())并检查指针是否为空。

甚至删除on_pushButtonAdd_clicked()方法并直接将按钮事件连接到模型插入方法(如果需要,使用lambda表达式),尽管这可能不是以Qt开头的更好方式(因为插槽连接在自动断开连接时两个对象中的一个被删除,而与lambda的连接不是,因此不太容易出错)。

+0

您能否给我发一段代码,说明如何从插槽访问模型(MainWindow成员数据)?这正是我想要做的,并且无法弄清楚......这行是否正确:'QSqlTableModel * model = new QSqlTableModel(this,db);'correct? – romromrom

+0

更多或更少的: 类Foo:公共的QWidget { * QSqlTableModel的m_model; Foo(QSqlDatabase db):m_model(new QSqlTableModel(this,db)){} void mySlot(){m_model-> insertRows(...); } }; – Jim

0

谢谢您的帮助,吉姆 - 事实是,我犯了一个愚蠢的错误: 我不知道,我需要指针申报到我的模型类的头文件:

private: 
    QSqlTableModel *model; 

就是这样。

正如我所说 - C++新手。对不起,...