QTableView - сигнал об изменении выбора не получен

Я новичок в QT, и мне трудно понять, как обрабатывается сигнал изменения выбора QTableView. Я установил окно с виджетом openGL и файлом QTableView. У меня есть класс модели данных, который правильно заполняет табличное представление, поэтому я добавил в этот класс публичный слот:

class APartsTableModel : public QAbstractTableModel
{
public:
    AVehicleModel *vehicle;
    explicit APartsTableModel(QObject *parent = 0);

    //MVC functions
    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &paret) const;
    QVariant data(const QModelIndex &index, int role) const;
    QVariant headerData(int section, Qt::Orientation orientation, int role) const;

public slots:
    void selectionChangedSlot(const QItemSelection &newSelection,
                              const QItemSelection &oldSelection);

};

Когда я готов показать окно с табличным представлением, я выделяю/инициализирую его следующим образом:

//create the display view
AStarModelView *displayWindow = new AStarModelView(this,
                                                   starModel->vehicle);

//create the datamodel for the table view
APartsTableModel *dataModel = new APartsTableModel(displayWindow);
dataModel->vehicle = starModel->vehicle;

//create selection model for table view
QItemSelectionModel *selModel = new QItemSelectionModel(dataModel);
displayWindow->materialsTable->setSelectionModel(selModel);

//setup model and signal
displayWindow->materialsTable->setModel(dataModel);

connect(selModel,
        SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)),
        dataModel,
        SLOT(selectionChangedSlot(const QItemSelection &, const QItemSelection &)));

//show the view
displayWindow->show();

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


person JeffW    schedule 21.12.2011    source источник


Ответы (4)


Когда вы вызываете setModel() для представления, ваша локально выделенная модель QItemSelectionModel заменяется моделью, созданной представлением. В любом случае вам не нужно создавать свою собственную модель выбора. Просто измените подключение к

connect(displayWindow->materialsTable->selectionModel(),
        SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
        dataModel,
        SLOT(selectionChangedSlot(const QItemSelection&, const QItemSelection&)));
person kenrogers    schedule 21.12.2011
comment
Извините, просто перечитайте свой вопрос, и я вижу, что пытался не выделять новую QItemSelectionModel, но это тоже не сработало. Возможно, это неправильный ответ, хотя верно то, что ваша локальная модель выбора будет заменена при вызове setModel. Вы также должны убедиться, что SelectionMode в представлении не QAbstractItemView::NoSelection. - person kenrogers; 21.12.2011
comment
Я установил для SelecionMode значения SelectRow и SelectItem, но, похоже, это не помогает. Я также переместил вызов setModel() над вызовом setSelectionModel(), чтобы избежать замены новой модели выбора. Все равно не повезло. - person JeffW; 21.12.2011
comment
Вы пытались подключиться к сигналу currentChanged() вместо selectionChanged()? - person kenrogers; 21.12.2011
comment
Что в первую очередь следует проверить в QT, если кажется, что сигналы/слоты работают неправильно? Что в вашем классе есть макрос Q_OBJECT. Добавил это в определение класса APartsTable, и теперь я достиг точки останова. Когда наступит пятница? - person JeffW; 22.12.2011

Что в первую очередь следует проверить в QT, если кажется, что сигналы/слоты работают неправильно? Что в вашем классе есть макрос Q_OBJECT. Добавил это в определение класса APartsTable, и теперь я достиг точки останова.

Когда наступит пятница?

person JeffW    schedule 23.12.2011

Просто чтобы вытащить ответ из обсуждения:

Что в первую очередь следует проверить в QT, если кажется, что сигналы/слоты работают неправильно? Что в вашем классе есть макрос Q_OBJECT. Добавил это в определение класса APartsTable, и теперь я достиг точки останова.

.

person JeffW    schedule 22.12.2011

virtual Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const должен вернуть Qt::ItemIsSelectable | otherFlags

person user9141488    schedule 26.12.2017