Установка модели в QTableWidget - PullRequest
7 голосов
/ 16 июля 2009

Я хочу написать приложение, которое может получить доступ к таблице в базе данных. Я взял QSqlTableModel в качестве компонента модели для таблицы.

Проблема с QTableView заключается в том, что у него, похоже, нет метода, который возвращает текущую выбранную запись в таблице, поэтому я взял класс QTableWidget, который взаимодействует с QTableView.

Но когда я пытаюсь установить модель для этого виджета таблицы с помощью -> setModel (), я получаю

следующее сообщение об ошибке:

C: / Qt / Qt / включить / QtGui /../../ SRC / GUI / itemviews / qtablewidget.h: 337: ошибка: `virtual void QTableWidget :: setModel (QAbstractItemModel *) ' частный.

В сообщении говорится, что метод "setModel" является закрытым. Глядя в документация говорит мне, что это общедоступно.

Что я могу сделать?

Ответы [ 5 ]

6 голосов
/ 16 июля 2009

Как уже отмечали другие, это не 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, вы работаете в слоте, подключенном к - скажем - clicked(QModelIndex) сигналу QTableView (на самом деле: QAbstractItemView), то этот код - то, что вам нужно:

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. QSqlTableModel может иметь более удобный способ сопоставить QModelIndex обратно с QSqlRecord, но вы идете.

2 голосов
/ 16 июля 2009

Метод общедоступен на уровне QAbstractItemView, но QTableWidget имеет встроенную модель, которую нельзя изменить.

Чтобы получить выделение, вы должны вызвать selectedItems() (который снова является методом QAbstractItemView, а не QTableView, поэтому вы пропустили его в документации).

0 голосов
/ 16 июля 2009

Я использовал архитектуру представления модели только один раз, но постараюсь дать вам общее представление об этой архитектуре, потому что, как мне кажется, вы еще не очень хорошо ее понимаете. Так что это, вероятно, будет неполным и упрощенным, но, надеюсь, в некоторой степени правильным.

Если вы работаете с видом, вы можете предоставить свою собственную модель. Если вы работаете с виджетом, то вы не работаете с моделью qt, а вставляете элементы самостоятельно. Предпочтительно вы работаете с моделью, чтобы отделить вещи (чтобы вы могли иметь более одного вида для одной и той же модели или изменить модель позже, ...)

Когда вы используете модель, представление само по себе знает, как попросить предоставленную вами модель заполнить представление (используя функцию данных). Есть несколько способов получить выбор из этого представления: я обработал его, соединив сигнал clicked, который представление генерирует, когда пользователь щелкает в представлении, к функции слота, которую я написал сам. Сигнал clicked обеспечивает индекс таблицы / списка, который я сопоставляю с элементом в моей модели в этой функции слота.

Возможно, есть и другие способы сделать это, но вот как я это сделал, и все работает отлично.

Чтобы получить общее представление об архитектуре вида модели qt:

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

0 голосов
/ 16 июля 2009

QTableWidget: подробности

Класс QTableWidget предоставляет табличное представление на основе элементов с моделью по умолчанию.

Табличные виджеты предоставляют стандартные средства отображения таблиц для приложений. Элементы в QTableWidget предоставляются QTableWidgetItem.

Если вам нужна таблица, использующая вашу собственную модель данных, вам следует использовать QTableView, а не этот класс.

Класс виджета обрабатывает саму модель, если вы хотите использовать свою собственную модель, используйте класс View.

Вы правы в том, что, похоже, нет способов узнать выбор для TableView или SQLModel. Вы можете получить свой собственный класс из TableView и отслеживать текущий выбор через слот selectionChanged .

OR

Используйте QTableView :: selectionModel () и вызовите selection () . Это похоже на ответ mmutz . Обязательно прочитайте этот код, чтобы узнать подробности того, как на самом деле попасть на запись.

0 голосов
/ 16 июля 2009

приватно в QTableWidget

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

публично в QAbstractItemView

так что вы не можете вызвать эту функцию отсюда ...

проверьте qtablewidget.h в include \ Qt \ qtablewidget.h

возможно, это не очень хороший ответ, но, по крайней мере, показывает, почему он не работает ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...