2009-07-16 185 views
7

我想寫一個可以訪問數據庫中的表的應用程序。我將QSqlTableModel作爲表格的模型組件。將模型設置爲QTableWidget

與QTableView的問題是,它似乎沒有方法返回表中當前選定的記錄,所以我採取QTableWidget類interhits QTableView。

但當我嘗試將模型設置爲與此表插件 - >則setModel()我得到

以下錯誤信息:

c:/Qt/qt/include/QtGui/../../src/gui/itemviews/qtablewidget.h:337: error: `virtual void QTableWidget::setModel(QAbstractItemModel*)' is private.

有消息稱,該方法「則setModel」是私人的。調查 文檔告訴我它是公開的。

我該怎麼辦?

+0

我需要記錄在一個小區,但它沒有座標。 – crew4ok 2009-07-16 15:01:02

回答

5

正如其他人已經指出,它不是你想要的QTableWidget。這確實是QTableView。獲取記錄,然後做這樣的:

static QList<QSqlRecord> selected_records(const QTableView * tv) { 
    // make sure we're really dealing with what we think we're dealing with: 
    assert(static_cast<QSqlTableModel*>(tv->model()) 
      == qobject_cast<QSqlTableModel*>(tv->model()); 
    const QSqlTableModel * const tm = static_cast<QSqlTableModel*>(tv->model()); 
    const QModelIndexList mil = tv->selectionModel()->selectedRows(); 
    QList<QSqlRecord> result; 
    Q_FOREACH(const QModelIndex & mi, mil) 
     if (mi.isValid()) 
      result.push_back(tm->record(mi.row())); 
    return result; 
} 

如果OTOH,您在連接到一個時隙工作 - 說 - 的QTableView(真:QAbstractItemViewclicked(QModelIndex)信號,那麼這段代碼是你想要什麼:

void slotClicked(const QModelIndex & mi) { 
    // make sure we're really dealing with what we think we're dealing with: 
    assert(static_cast<QSqlTableModel*>(tableView->model()) 
      == qobject_cast<QSqlTableModel*>(tableView->model()); 
    const QSqlRecord rec = static_cast<QSqlTableModel*>(tableView->model()) 
       ->record(mi.row()); 
    // use 'rec' 
} 

是的,Qt可以有內置的,特別是。 QSqlTableModel可以有一個更方便的方法來映射QModelIndex回到QSqlRecord,但你去。

0

這是QTableWidget的私人

class Q_GUI_EXPORT QTableWidget : public QTableView 
{ 
... 
... 
private: 
    void setModel(QAbstractItemModel *model); 
... 

它是公衆QAbstractItemView中

所以你不能叫從這裏這個函數...

檢查qtablewidget.h中包括\ Qt的\ QTableWidget的.h

也許這不是一個好的答案,但至少它顯示了爲什麼它不工作...

0

QTableWidget:Details

The QTableWidget class provides an item-based table view with a default model.

Table widgets provide standard table display facilities for applications. The items in a QTableWidget are provided by QTableWidgetItem.

If you want a table that uses your own data model you should use QTableView rather than this class.

Widget類處理模型本身,如果你想用自己的模型使用的視圖類。

你是對的,似乎沒有方法來知道TableView或SQLModel的選擇。您可以從TableView派生自己的類,並通過selectionChanged slot跟蹤當前選擇。

OR

使用QTableView::selectionModel()並調用selection()。這與mmutz的answer類似。請務必閱讀該代碼,以獲取實際記錄的血腥細節。

+0

小心。這裏不需要`selectionModel`:這是用於處理在視圖中選擇項目的類型,例如,使用按住Shift鍵單擊。內部數據模型只是視圖的「模型」屬性。 – quark 2009-07-27 07:42:50

2

該方法公開於QAbstractItemView的等級,但QTableWidget具有您無法更改的內置模型。

要獲得選擇,您必須致電selectedItems()(這也是QAbstractItemView的一種方法,而不是QTableView,這就是您在文檔中忽略它的原因)。

+0

我需要使用QTableView,因爲公共setModel()函數,但QTableView hasnt selectedItems()函數。 P.S.對不起我的英語不好。 – crew4ok 2009-07-16 14:45:00

+0

就像Aaron所說的,selectedItems()是QTableView的一部分 - 它是基類QAbstractItemView的一部分。 – swongu 2009-07-16 16:46:19

0

我只使用了模型視圖體系結構一次,但是我會嘗試給你一些關於該體系結構的一般洞察,因爲在我看來,你還沒有很好地理解它。所以這可能會不完整和簡化,但希望稍微正確。

如果您使用視圖,您可以提供自己的模型。如果你使用一個小部件,那麼你不用qt模型工作,但自己插入項目。您最好使用模型來解耦事物(以便您可以爲同一模型創建多個視圖,或稍後更改模型...)

當您使用模型時,視圖本身會知道如何詢問您提供的模型以填充視圖(使用數據函數)。有幾種方法可以從這個視圖中獲得選擇:我已經通過連接點擊的信號來處理它,即當用戶在視圖中單擊時發出的視圖發送到我自己寫的插槽函數。點擊的信號提供了我在該插槽函數中映射到我的模型中的項目的表格/列表的索引。

有可能有更多的方法來做到這一點,但多數民衆贊成我是如何做到的,它工作正常。

要獲得一般掌握在QT模型視圖架構:

http://doc.trolltech.com/4.5/model-view-programming.html

相關問題