多个 QTableWidget 的共享选择

问题描述 投票:0回答:1

我正在使用 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);
。但这并没有帮助。
    

c++ qt qt5 qtablewidget
1个回答
0
投票
此帮助页面

中所解释的(我的重点):

有关视图中所选项目的信息存储在 QItemSelectionModel 类的实例中。这维护单个模型中项目的模型索引,并且独立于任何视图。由于模型上可以有多个视图,

可以在视图之间共享选择,从而允许应用程序以一致的方式显示多个视图。

您感兴趣的方法是成对出现的:

  • ui->tbMonitoring->setSelectionMode(QAbstractItemView::ExtendedSelection);

     / 
    model
    
    

  • setModel(QAbstractItemModel*)

     / 
    selectionModel()
    
    对于最后一个,请花一点时间仔细阅读文档的内容,即:

    请注意,如果在此函数之后调用 setModel(),给定的 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
    是初学者的选择,简化了许多所需的工作,但它对灵活性设置了如此大的限制,以至于很少使用。
    有经验的 Qt 开发人员也倾向于避免 
  • QTableWidget
  • (注意
    QStandardItemModel
    类都使用自己的内部独立模型)。
    如果您的应用程序将您在屏幕上显示的数据存储在内部结构中,通常会更有效将其
    映射
    QxxxxxWidget的自定义子类,而不是
    复制
    到独立模型,例如QAbstractItemModel
    
    
  • 您越早习惯创建自己的模型类,您的生活就会变得越轻松。
就您而言,您正在使用表格,您可以使用


QStandardItemModel

 开始您的学习之旅。与
QAbstractTableModel相比,它应该足够容易访问,并且一般来说更容易子类化。

以上内容适用于您当前的代码,因此请随意忽略此建议

© www.soinside.com 2019 - 2024. All rights reserved.