2014-12-03 5 views

ответ

1

Вы можете отключить выбор с этим:

connect(ui->tableView->selectionModel(),&QItemSelectionModel::selectionChanged,[=]() {//with lambda 
    if(ui->tableView->selectionModel()->selectedIndexes().size() > 1) 
     ui->tableView->setSelectionMode(QAbstractItemView::NoSelection); 
}); 

Я здесь C++11 (CONFIG += c++11 в .pro файл) и new syntax of signals and slots, но, конечно, вы можете использовать старый синтаксис, если вы хотите.

Но в этом случае после этого пользователь не сможет использовать выбор вообще. Если это то, что вы хотите, тогда все в порядке. Если нет, то вы можете включить выбор, например, когда tableView теряет фокус или предоставляет для этого специальную кнопку.

Но я также думаю, что следующий код является более подходящим для вас:

connect(ui->tableView->selectionModel(),&QItemSelectionModel::selectionChanged,[=]() {//with lambda 
    if(ui->tableView->selectionModel()->selectedIndexes().size() > 2) 
    { 
     QList<QModelIndex> lst = ui->tableView->selectionModel()->selectedIndexes(); 
     ui->tableView->selectionModel()->select(lst.first(),QItemSelectionModel::Deselect); 
    } 
}); 

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

+0

Спасибо, Чернобыль, я использовал ваше второе решение, где я заменил «lst.first()» на «lst.last()». Он делает именно то, что я искал. Тем не менее, мне интересно, нет ли какой-либо конкретной причины, почему нет такого метода как QTableView :: set_Max_Number_SelectedItems (int) .. –

+0

@ jp_doyon1 Qt - мощный инструмент, но он не может и не должен содержать абсолютно все. Иногда мы должны искать способ выполнения какой-либо задачи. – Chernobyl