2015-08-12 1 views
1

я получил следующую программу:Как получить только один выбор на нескольких QListViews?

mainwindow.h:

#include <QDialog> 
#include <QListView> 
#include <QStandardItemModel> 
#include <QStandardItem> 
#include <QVBoxLayout> 

class MainWindow : public QDialog { 
Q_OBJECT 

public: 
explicit MainWindow(QWidget *parent = 0); 

private: 
QVBoxLayout layout; 

QListView view1, view2, view3; 

QStandardItemModel model1, model2, model3; 

QStandardItem item1, item2, item3, item4, item5, item6; 
}; 

mainwindow.cpp:

#include "mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QDialog(parent), 
    item1 {"Item 1"}, 
    item2 {"Item 2"}, 
    item3 {"Item 3"}, 
    item4 {"Item 4"}, 
    item5 {"Item 5"}, 
    item6 {"Item 6"} 
{ 
    model1.appendColumn({&item1, &item2}); 
    model2.appendColumn({&item3, &item4}); 
    model3.appendColumn({&item5, &item6}); 

    view1.setModel(&model1); 
    view2.setModel(&model2); 
    view3.setModel(&model3); 

    layout.addWidget(&view1); 
    layout.addWidget(&view2); 
    layout.addWidget(&view3); 

    this->setLayout(&layout); 

    connect(view1.selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), 
      view2.selectionModel(), SLOT(reset())); 
    connect(view1.selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), 
      view3.selectionModel(), SLOT(reset())); 

    connect(view2.selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), 
      view1.selectionModel(), SLOT(reset())); 
    connect(view2.selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), 
      view3.selectionModel(), SLOT(reset())); 

    connect(view3.selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), 
      view2.selectionModel(), SLOT(reset())); 
    connect(view3.selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), 
      view1.selectionModel(), SLOT(reset())); 
} 

main.cpp:

#include "mainwindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) { 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.exec(); 

    return a.exec(); 
} 

a.pro

TEMPLATE = app 
TARGET = a 
INCLUDEPATH += . 
QT += widgets 
CONFIG += c++11 
HEADERS += mainwindow.h 
SOURCES += main.cpp mainwindow.cpp 

Это была моя попытка создать QDialog, который имеет несколько QListViews с различными моделями, в которых только один элемент может быть выбран одновременно. Он работает, если вы просто нажимаете на разные элементы, но как только вы нажимаете QListView в пустом пространстве, а затем щелкните элемент, вы выбираете несколько записей. Выбор затем очищается только в том случае, если я либо нажимаю другой QListView в пустом пространстве, либо сворачиваю диалог и снова активирую его.

Что мне не хватает? Нужно ли подключать другие slots/signals?

ответ

2

использованием clearSelection вместо reset, кажется, сделать трюк

Кроме того, в соответствии с Документами [1], [2] это кажется более подходящей функции для этого.

+1

Ой, я просто не использовал его, потому что он испускает сигнал selectionChanged, который я пропустил где-то еще в моем проекте. Большое спасибо ;-) –

+1

Только одна вещь, которую я заметил: мне, вероятно, придется использовать что-то другое, чем currentChanged, так как по-прежнему можно выбрать несколько записей. Сигнал щелчка QListView должен делать трюк. –

+0

http://doc.qt.io/qt-5/qabstractitemview.html#selectionMode-prop имеет один режим выбора. Возможно, это работает. Я бы предположил, что это можно сделать, если не сделать это вручную (внутри одного 'QListView' я имею в виду, а не через несколько) –

Смежные вопросы