2009-07-16 34 views
7

Tôi muốn viết một ứng dụng có thể truy cập một bảng trong cơ sở dữ liệu. Tôi đã QSqlTableModel là thành phần mô hình cho bảng.Đặt mô hình thành QTableWidget

Vấn đề với QTableView là dường như không có phương thức trả về bản ghi hiện được chọn trong bảng vì vậy tôi đã lấy lớp QTableWidget liên kết QTableView.

Nhưng khi tôi cố gắng để thiết lập các mô hình để phụ tùng bảng này với -> setModel() tôi nhận được

thông báo lỗi sau:

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

Thông điệp nói rằng phương pháp "setModel" là riêng tư. Nhìn vào tài liệu cho tôi biết rằng tài liệu đó là công khai.

Tôi có thể làm gì?

+0

tôi cần để có được một kỷ lục trong một tế bào, nhưng không phải là tọa độ của nó. – crew4ok

Trả lời

5

Như những người khác đã lưu ý, nó không phải là QTableWidget mà bạn muốn. Đó thực sự là QTableView.Bắt các hồ sơ sau đó được thực hiện như thế này:

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; 
} 

Nếu, OTOH, bạn đang làm việc trong một khe cắm kết nối với - nói - clicked(QModelIndex) tín hiệu của QTableView (thực sự: QAbstractItemView), sau đó mã này là những gì bạn muốn:

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' 
} 

Có, Qt có thể tích hợp sẵn và đặc biệt. QSqlTableModel có thể có một cách thuận tiện hơn để lập bản đồ số QModelIndex quay lại QSqlRecord, nhưng bạn đã đến.

+0

Như tôi đã hiểu, tôi phải sử dụng nó với tín hiệu click(). Nhưng khi tôi kiểm tra xem QList có trống không, tôi nhận được rằng nó trống. =/ – crew4ok

+0

Nếu bạn sử dụng 'QAbstractItemView :: click (QModelIndex)', 'QModelIndex' được truyền như một đối số tín hiệu. Đoạn mã trên là dành cho trường hợp bạn muốn xem những gì các bản ghi được chọn. Trong trường hợp 'click()', bạn chỉ cần hai dòng bên trong 'Q_FOREACH', với' mi' là 'QModelIndex' đến từ tín hiệu. –

+0

Cảm ơn, bạn đã trả lời câu hỏi của tôi =). – crew4ok

0

nó là tư nhân trong QTableWidget

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

nó là công khai trong QAbstractItemView

vì vậy bạn không thể gọi chức năng này từ đây ...

séc qtablewidget.h trong bao gồm \ Qt \ qtablewidget .h

có thể đó không phải là câu trả lời hay nhưng ít nhất nó cho thấy lý do tại sao nó không hoạt động ...

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.

Lớp phụ tùng xử lý các mô hình riêng của mình, nếu bạn muốn sử dụng mô hình của riêng bạn sử dụng lớp View.

Bạn đúng là dường như không có phương pháp nào để biết lựa chọn cho TableView hoặc SQLModel. Bạn có thể lấy được lớp của riêng bạn từ TableView và theo dõi lựa chọn hiện tại thông qua các selectionChanged slot.

HOẶC

Sử dụng QTableView::selectionModel() và gọi selection(). Điều này tương tự như số answer của mmutz. Hãy chắc chắn để đọc mã cho các chi tiết đẫm máu của thực sự nhận được để ghi lại.

+0

Cẩn thận. Bạn không muốn 'selectionModel' ở đây: đó là loại được sử dụng để xử lý việc chọn các mục trong chế độ xem theo, ví dụ: sử dụng Shift-click. Mô hình dữ liệu nội bộ đơn giản là thuộc tính 'mô hình' của một khung nhìn. – quark

2

Phương pháp này là công khai ở cấp độ QAbstractItemView nhưng QTableWidget có một mô hình tích hợp mà bạn không thể thay đổi.

Để nhận lựa chọn, bạn phải gọi selectedItems() (một lần nữa là phương thức QAbstractItemView và không phải QTableView đó là lý do bạn bỏ qua trong tài liệu).

+0

Tôi cần sử dụng QTableView vì hàm setModel() công khai, nhưng QTableView không chọn hàm Items(). P.S. Xin lỗi vì tiếng Anh của tôi. – crew4ok

+0

Giống như Aaron đã nói, selectedItems() là một phần của QTableView - nó là một phần của lớp cơ sở QAbstractItemView. – swongu

+0

Tôi không thấy các mục SelectedItems trong QAbstractItemView: http://doc.trolltech.com/4.5/qabstractitemview-members.html –

0

Tôi chỉ sử dụng kiến ​​trúc chế độ xem mô hình một lần, nhưng tôi sẽ cố gắng cung cấp cho bạn một số thông tin chi tiết chung về kiến ​​trúc đó, vì có vẻ như với tôi bạn chưa hiểu rõ về nó. Vì vậy, điều này có thể sẽ không đầy đủ và đơn giản, nhưng hy vọng có phần chính xác.

Nếu bạn làm việc với chế độ xem, bạn có thể cung cấp cho mình mô hình riêng. Nếu bạn làm việc với một widget, sau đó bạn không làm việc với một mô hình qt, nhưng chèn các mục mình. Tốt hơn là bạn làm việc với một mô hình để phân tách mọi thứ (vì vậy bạn có thể có nhiều hơn một chế độ xem cho cùng một mô hình hoặc thay đổi mô hình sau này, ...)

Khi bạn sử dụng một mô hình, chính chế độ xem sẽ biết cách yêu cầu mô hình bạn cung cấp để điền vào chế độ xem (sử dụng chức năng dữ liệu). Có một số cách để có được lựa chọn từ chế độ xem này: Tôi đã xử lý nó bằng cách kết nối tín hiệu được nhấp, mà chế độ xem phát ra khi người dùng nhấp vào chế độ xem, với chức năng vị trí mà tôi đã tự viết. Tín hiệu được nhấp cung cấp chỉ mục của bảng/danh sách mà tôi ánh xạ tới một mục trong mô hình của tôi trong hàm vị trí đó.

Có thể có nhiều cách để làm điều đó, nhưng đó là cách tôi đã làm nó và nó hoạt động tốt.

Để có được một nắm chung về kiến ​​trúc Model-View qt:

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

Các vấn đề liên quan