2009-07-16 2 views
7

데이터베이스의 테이블에 액세스 할 수있는 응용 프로그램을 작성하고 싶습니다. QSqlTableModel을 테이블의 모델 구성 요소로 사용했습니다.모델을 QTableWidget으로 설정

QTableView의 문제점은 테이블에서 현재 선택된 레코드를 반환하는 메서드가없는 것 같아서 QTableView를 삽입하는 QTableWidget 클래스를 사용했다는 것입니다.

하지만 난이 테이블 위젯 모델을 설정하려고하면 ->로 setModel() 내가

을 얻을 다음과 같은 오류 메시지가 :

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

메시지는 방법 "로 setModel"는 것을 말한다 은밀한. 설명서를 살펴보면 공개임을 알 수 있습니다.

어떻게해야합니까? \ Qt를 \ qtablewidget을 포함에

+0

내가 셀에 기록을 얻을 필요가 있지만, 아닌 좌표 :

는 Qt는 모델 - 뷰 아키텍처에 대한 일반적인 이해를 얻으려면. – crew4ok

답변

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, 당신은에 연결된 슬롯에 작업하는, 경우 - 말 - (정말 : QAbstractItemView) QTableViewclicked(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는 내장형이며 esp. QSqlTableModelQModelIndexQSqlRecord으로 다시 매핑하는 더 편리한 방법을 가질 수 있습니다.하지만 거기에 가야합니다.

+0

알다시피, clicked() signal.But와 함께 사용해야합니다.하지만 QList가 비어 있는지 확인하면 비어 있습니다. =/ – crew4ok

+0

'QAbstractItemView :: clicked (QModelIndex)'를 사용하면 'QModelIndex'는 신호 인수로 전달됩니다. 위의 코드는 선택한 레코드가 무엇인지보고 싶습니다. 'clicked()'의 경우,'Q_FOREACH' 안에는 두 줄만 있으면되고,'mi'는 신호에서 나오는'QModelIndex '입니다. –

+0

고마워, 너 내 질문에 대답했다.). – crew4ok

0

이 QTableWidget 민간 것은

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

는 QAbstractItemView

그렇게

여기에서이 함수를 호출하지 못할 ...

체크 qtablewidget.h 공개 .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.

위젯 클래스 (10)은 모델 자체를 처리합니다.

TableView 또는 SQLModel에 대한 선택을 알 수있는 방법이없는 것처럼 보입니다. TableView에서 사용자 고유의 클래스를 파생시키고 selectionChanged slot을 통해 현재 선택 항목을 추적 할 수 있습니다.

또는

QTableView::selectionModel() 및 전화 selection() 사용. 이것은 mmutz의 answer과 유사합니다. 실제로 레코드를 얻는 것에 대한 자세한 내용은 해당 코드를 반드시 읽으십시오.

+0

조심성. 여기서 'selectionModel'을 원하지 않습니다 : 뷰에서 항목을 선택하는 것을 처리하는 데 사용되는 유형입니다 (예 : Shift 키를 누른 상태에서 클릭하십시오. 내부 데이터 모델은 단순히 뷰의'model' 속성입니다. – quark

2

이 방법은 공개 QAbstractItemView 수준이지만 QTableWidget에는 변경할 수없는 내장 모델이 있습니다.

선택을 얻으려면 selectedItems() (다시 QAbstractItemView의 방법이며 QTableView이 아니므로 문서에서 빠뜨린 이유입니다)이라고해야합니다.

+0

공용 setModel() 함수 때문에 QTableView를 사용해야하지만 QTableView에는 selectedItems() 함수가 없습니다. P. 미안해, 내 영어로. – crew4ok

+0

Aaron이 말했듯이 selectedItems()는 QTableView의 일부입니다.이 클래스는 기본 클래스 인 QAbstractItemView의 일부입니다. – swongu

+0

QAbstractItemView 아래에서 selectedItems가 보이지 않습니다. http://doc.trolltech.com/4.5/qabstractitemview-members.html –

0

저는 모델 뷰 아키텍처를 한 번만 사용했습니다. 아직 잘 이해하지 못하는 것 같아서 아키텍처에 대한 일반적인 통찰력을 제공하려고 노력할 것입니다. 따라서 이것은 아마도 불완전하고 단순화 될 것이지만, 아마도 다소 정확할 것입니다.

보기로 작업하는 경우 자신 만의 모델을 제공 할 수 있습니다. 위젯을 사용한다면 qt 모델로 작업하지 않고 직접 항목을 삽입하십시오. 가급적 모델을 사용하여 작업을 분리 할 수 ​​있습니다 (동일한 모델에 대해 둘 이상의보기를 가질 수 있거나 나중에 모델을 변경할 수 있습니다 ...)

모델을 사용할 때 뷰는 자체적으로 (데이터 함수를 사용하여) 뷰를 채우도록 제공 한 모델에 요청하십시오. 이 뷰에서 선택하는 방법에는 여러 가지가 있습니다. 사용자가보기를 클릭 할 때보기가 방출하는 클릭 신호를 연결하여 처리했습니다. 직접 작성한 슬롯 기능으로 처리했습니다. 클릭 된 신호는 해당 슬롯 함수에서 내 모델의 항목에 매핑하는 테이블/목록의 인덱스를 제공합니다.

아마 할 수있는 방법이 더 많지만, 어떻게했는지 잘 작동합니다.

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

관련 문제