Установка модели к QTableWidget

Ширина по сравнению с Глубиной; думайте с точки зрения дерева ссылок с Вашим объектом как корневой узел.

Мелкий:

Before Copy Shallow Copying Shallow Done

переменные A и B относятся к различным областям памяти, когда B присвоен, эти две переменные относятся к той же области памяти. Более поздние модификации к содержанию любого немедленно отражаются в содержании другого, поскольку они совместно используют содержание.

Глубоко:

Before Copy Deep Copying Deep Done

переменные A и B относятся к различным областям памяти, когда B присвоен значения в области памяти, которая точки к копируются в область памяти, на которую указывает B. Более поздние модификации к содержанию или остаются уникальными для A или B; содержание не совместно используется.

7
задан eyllanesc 4 September 2017 в 16:42
поделиться

5 ответов

Как отмечали другие, это ' s не 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, вы работаете в слоте, подключенном, скажем, - щелкнул (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 может иметь это встроенное, и особенно. QSqlTableModel мог бы иметь более удобный способ сопоставить QModelIndex обратно в QSqlRecord , но готово.

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

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

6
ответ дан 7 December 2019 в 05:26
поделиться

it is private in QTableWidget

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

it is public in QAbstractItemView

so you cant call this function from here...

check qtablewidget.h in include\Qt\qtablewidget.h

maybe it is not a good answer but at least it shows why it is not working...

0
ответ дан 7 December 2019 в 05:26
поделиться

The method is public at the level of QAbstractItemView but QTableWidget has a built-in model which you can't change.

To get the selection, you must call selectedItems() (which is again a method of QAbstractItemView and not QTableView which is why you missed it in the docs).

2
ответ дан 7 December 2019 в 05:26
поделиться

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

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

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

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

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

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

0
ответ дан 7 December 2019 в 05:26
поделиться

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.

The widget class handles the model itself, if you want to use your own model use the View class.

You are correct that there does not seem to be methods for knowing the selection for the TableView or SQLModel. You could derive your own class from the TableView and track the current selection through the selectionChanged slot.

OR

Use the QTableView::selectionModel() and call selection(). This is similar to mmutz's answer. Be sure to read that code for the gory details of actually getting to the record.

0
ответ дан 7 December 2019 в 05:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: