2009-07-16 24 views
7

Desidero scrivere un'applicazione in grado di accedere a una tabella nel database. Ho preso QSqlTableModel come componente del modello per la tabella.Impostazione del modello su un QTableWidget

Il problema con QTableView è che sembra non avere alcun metodo che restituisca il record attualmente selezionato nella tabella, così ho preso la classe QTableWidget che intercetta QTableView.

Ma quando provo a impostare il modello di questo widget tavola con -> setModel() ottengo

il seguente messaggio di errore:

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

Il messaggio dice che il metodo "setModel" è privato. Esaminare la documentazione mi dice che è pubblico.

Cosa posso fare?

+0

ho bisogno di ottenere un record in una cella, ma non le coordinate di esso. – crew4ok

risposta

5

Come altri hanno notato, non è QTableWidget che si desidera. È infatti QTableView.Ottenere i record viene fatto in questo modo:

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

Se, OTOH, si sta lavorando in uno slot collegato al - dicono - clicked(QModelIndex) segnale QTableView (in realtà: QAbstractItemView), allora questo codice è quello che si vuole:

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

Sì, Qt potrebbe avere quel built-in, ed esp. QSqlTableModel potrebbe avere un modo più conveniente per mappare uno QModelIndex su un QSqlRecord, ma ci si va.

+0

A quanto ho capito, devo usare con cliccato() signal.But quando sto controllando se il QList è vuoto Ottengo che è vuota. =/ – crew4ok

+0

Se si utilizza 'QAbstractItemView :: cliccato (QModelIndex)', il 'QModelIndex' viene passato come argomento del segnale. Il codice sopra riportato si riferisce al caso in cui si desidera vedere quali sono i record selezionati. Nel caso di 'clicked()', hai solo bisogno delle due linee all'interno di 'Q_FOREACH', con' mi' come 'QModelIndex' proveniente dal segnale. –

+0

Grazie, hai risposto alla mia domanda =). – crew4ok

0

è privata in QTableWidget

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

è pubblico in QAbstractItemView

quindi potete chiama questa funzione da qui ...

controllo qtablewidget.h in include \ Qt \ qtablewidget .h

forse non è una buona risposta ma almeno mostra perché non funziona ...

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.

La classe widget di maniglie del modello stesso, se si desidera utilizzare il proprio modello di utilizzare la classe View.

È corretto che non ci siano metodi per conoscere la selezione per TableView o SQLModel. Puoi ricavare la tua classe dal TableView e tracciare la selezione corrente attraverso lo selectionChanged slot.

O

Utilizzare i QTableView::selectionModel() e chiamare selection(). Questo è simile a answer di mmutz. Assicurati di leggere quel codice per i dettagli cruenti di ottenere effettivamente il record.

+0

Attenzione. Qui non vuoi 'selectionModel': questo è il tipo usato per gestire gli elementi selezionati nella vista, ad es. usando Maiusc-clic. Il modello di dati interno è semplicemente la proprietà 'model' di una vista. – quark

2

Il metodo è pubblico a livello di QAbstractItemView ma QTableWidget dispone di un modello incorporato che non è possibile modificare.

Per ottenere la selezione, è necessario chiamare selectedItems() (che è ancora una volta un metodo di QAbstractItemView e non QTableView ed è per questo ve lo siete perso nella documentazione).

+0

Ho bisogno di usare QTableView a causa di setModel pubblico() funzione, ma selectedItems QTableView hasnt() la funzione. P.S. Mi scusi per il mio inglese. – crew4ok

+0

Come Aaron detto, selectedItems() è una parte di QTableView - è una parte del QAbstractItemView classe base. – swongu

+0

Non vedo selectedItems sotto QAbstractItemView sia: http://doc.trolltech.com/4.5/qabstractitemview-members.html –

0

Ho usato l'architettura della vista del modello solo una volta, ma cercherò di darvi un'idea generale di quell'architettura, perché mi sembra che non la capiate molto bene ancora. Quindi questo sarà probabilmente incompleto e semplificato, ma si spera un po 'corretto.

Se si lavora con una vista, è possibile fornire il proprio modello. Se lavori con un widget, non lavori con un modello qt, ma inserisci gli elementi da solo. Preferibilmente si lavora con un modello per disaccoppiare le cose (in modo da poter avere più di una vista per lo stesso modello, o cambiare il modello più tardi, ...)

Quando si utilizza un modello, la vista sa come chiedere il modello che si fornisce per popolare la vista (utilizzando la funzione dati). Ci sono diversi modi per ottenere una selezione da questa vista: l'ho gestita collegando il segnale cliccato, che la vista emette quando l'utente fa clic nella vista, a una funzione di slot che ho scritto io stesso. Il segnale cliccato fornisce un indice della tabella/lista che mappo a un oggetto nel mio modello in quella funzione di slot.

Probabilmente ci sono altri modi per farlo, ma questo è come ho fatto e funziona benissimo.

di ottenere una comprensione generale sul qt model-view architettura:

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

Problemi correlati