我正在使用 Qt 5.6.1。 有多个QTableWidget表,理论上它们代表一张表——它们位置紧密,行上的数据是互连的,但它们应该作为单独的小部件呈现。他们的选择标志是 SelectRows 和 ExtendedSelection mod。 我如何对它们进行一般选择?假设您选择了第一个表的几行,并在其他表中选择了相同的行。应相应删除该选择。表格有不同的列数。
我尝试以这种方式处理来自选择模型表的
selectionChanged
信号:
void wSpisokActive::selectionChangedMain(const QItemSelection &selected, const QItemSelection &deselected)
{
permission_to_changed_main_ = false; // flag to exit a similar slot in another table
if (permission_to_changed_monitoring_) { // select row
QModelIndexList selected_list = selected.indexes();
for (QModelIndex model_index: selected_list) {
ui->tbMonitoring->selectRow(model_index.row());
}
QModelIndexList deselected_list = deselected.indexes();
int last_row = -1;
for (QModelIndex model_index: deselected_list) { // deselect row
if (last_row == model_index.row()) continue;
last_row = model_index.row();
for (int i = 0; i < ui->tbMonitoring->columnCount(); ++i) {
ui->tbMonitoring->selectionModel()->select(ui->tbMonitoring->model()->index(last_row, i), QItemSelectionModel::Deselect);
}
}
}
permission_to_changed_main_ = true;
}
但是这种方式通过 Ctrl 进行的选择处理不正确。另外,当选择多行时,只有最后一行突出显示 - 我尝试在选择行之前和之后设置
ui->tbMonitoring->setSelectionMode(QAbstractItemView::MultiSelection);
。但这并没有帮助。有关视图中所选项目的信息存储在 QItemSelectionModel 类的实例中。这维护单个模型中项目的模型索引,并且独立于任何视图。由于模型上可以有多个视图,可以在视图之间共享选择,从而允许应用程序以一致的方式显示多个视图。
您感兴趣的方法是成对出现的:
ui->tbMonitoring->setSelectionMode(QAbstractItemView::ExtendedSelection);
/
model
/
selectionModel()
对于最后一个,请花一点时间仔细阅读文档的内容,即:
如果不再需要旧的选择模型,则由应用程序删除它[...]
setSelectionModel(QItemSelectionModel*)
经验丰富的 Qt 开发人员往往更喜欢
auto model = myTableWidget->model();
auto selModel = myTableWidget->selectionModel();
for (auto view : { myTableView1, myTableView2, myTableView3 }) {
view->setModel(model);
delete view->selectionModel();
view->setSelectionModel(selModel);
}
QListView
、QTableView
,而不是 QTreeView
同行。虽然
QxxxxxWidget
QTableWidget
QStandardItemModel
类都使用自己的内部独立模型)。如果您的应用程序将您在屏幕上显示的数据存储在内部结构中,通常会更有效将其映射
QxxxxxWidget
的自定义子类,而不是复制到独立模型,例如
QAbstractItemModel
。
开始您的学习之旅。与
QAbstractTableModel
相比,它应该足够容易访问,并且一般来说更容易子类化。以上内容适用于您当前的代码,因此请随意忽略此建议。