2015-09-05 94 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++新手。對不起,...