2011-10-06 56 views
1

我正在嘗試qt助手中的基本QSortFilterProxyModel示例,並已使QSqlTableModel嘗試和過濾。我所做的示例沒有過濾,因爲它應該和我需要幫助以瞭解原因。QSortFilterProxyModel與QSqlTableModel

/* 
ned.h 
*/ 
#ifndef NED_H 
#define NED_H 

#include <QWidget> 
#include <QtSql> 
#include "ui_ned.h" 

class QSortFilterProxyModel; 

class ned : public QWidget 
{ 
    Q_OBJECT 

public: 
    ned(QWidget *parent = 0); 

private: 
    void setupModel(); 
    QSortFilterProxyModel *proxyModel; 
    QSqlTableModel *tableModel; 
    Ui::ned ui; 

private slots: 
    void filterRegExpChanged(); 
}; 

#endif // NED_H 
................................................................. 
................................................................. 
/* 
ned.cpp 
*/ 

#include <QtGui> 
#include <QtSql> 
#include <QwwClearLineEdit> 
#include "ned.h" 

ned::ned(QWidget *parent) : 
    QWidget(parent) 
{ 
    ui.setupUi(this); 
    setupModel(); 

    tableModel = new QSqlTableModel(ui.tableView); 
    tableModel->setEditStrategy(QSqlTableModel::OnManualSubmit); 
    tableModel->setTable("tables"); 

    ui.tableView->setModel(tableModel); 

    ui.tableView->setColumnHidden(tableModel->fieldIndex("id"), true); 

    ui.tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); 
    ui.tableView->setSelectionMode(QAbstractItemView::SingleSelection); 
    ui.tableView->setAlternatingRowColors(true); 
    ui.tableView->setSortingEnabled(true); 

    ui.tableView->setSelectionBehavior(QAbstractItemView::SelectRows); 
    ui.tableView->horizontalHeader()->setStretchLastSection(true); 

    proxyModel = new QSortFilterProxyModel; 
    proxyModel->setDynamicSortFilter(true); 
    proxyModel->setSourceModel(tableModel); 
    proxyModel->setFilterKeyColumn(1); 

    tableModel->select(); 
    //Locale 
    tableModel->setHeaderData(1, Qt::Horizontal, tr("Table Name")); 
    tableModel->setHeaderData(2, Qt::Horizontal, tr("Table Description")); 


    connect(ui.nedsort, SIGNAL(textChanged(QString)), 
      this, SLOT(filterRegExpChanged()),Qt::UniqueConnection); 

} 

void ned::setupModel() 
{ 
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 
    db.setDatabaseName("smith.DAT"); 
    if (!db.open()) 
    { 
     QMessageBox::critical(0, tr("Cannot open database"), 
           tr("Unable to establish a database connection.\n" 
           "This example needs SQLite support. Please read " 
           "the Qt SQL driver documentation for information how " 
           "to build it."), QMessageBox::Cancel); 
     return; 
    } 
} 


void ned::filterRegExpChanged() 
{ 
    QRegExp regExp(ui.nedsort->text()); 
    proxyModel->setFilterRegExp(regExp); 
} 

回答

2

此行是錯誤的:

ui.tableView->setModel(tableModel); 

你必須對模型設置爲proymodel(後):

ui.tableView->setModel(proxyModel); 
+0

感謝那些解決it.For的斯內德比如我有沒有一個小部件映射器,但在我正在處理的第二個示例中,我有一個小部件映射器。問題是,一旦我排序並且我有一個確切的行我正在尋找,點擊後,行的數據不會顯示在窗體上任何想法爲什麼? – Gandalf

+0

我把mapper-> setModel(proxyModel);並工作。 – Gandalf