如何在 Qt QTableView 中设置 Shift + 单击选择的初始索引?

Posted

技术标签:

【中文标题】如何在 Qt QTableView 中设置 Shift + 单击选择的初始索引?【英文标题】:How can I set the initial index for Shift + click selection in Qt QTableView? 【发布时间】:2021-09-27 12:22:13 【问题描述】:

我的问题是在 Ctrl + 单击后取消选择一个项目。它成为了下面 Shift + click select 的初始索引。

我希望将 Shift 选择的初始索引设置为索引 0。

例如:

#include <QApplication>
#include <QtWidgets>


int main(int argc, char *argv[])

    QApplication a(argc, argv);
    QStringListModel model("1", "2", "3", "4", "5", "6", "7", "8", "9");
    QTableView view;
    view.horizontalHeader()->setVisible(false);
    view.setSelectionBehavior(QAbstractItemView::SelectRows);
    view.setSelectionMode(QAbstractItemView::ExtendedSelection);
    view.setModel(&model);
    view.show();

    return a.exec();

    选择行标题 2

    使用 Ctrl + 单击取消选择行标题 2

    Shift + 单击行标题 5

预期结果: 已选择第 1、2、3、4 和 5 行。

实际结果: 已选择第 2、3、4 和 5 行。

有什么方法可以产生预期的结果?

【问题讨论】:

【参考方案1】:

为此,您应该将QTableView 子类化。这是针对 Qt4 测试的小示例。对于 Qt5,它应该非常相似。 标题:

#ifndef CUSTOMTABLEWIDGET_H
#define CUSTOMTABLEWIDGET_H

#include <QTableView>

class CustomTableWidget : public QTableView

    Q_OBJECT
public:
    explicit CustomTableWidget(QWidget *parent = 0);

protected:
    void mousePressEvent(QMouseEvent *event);
;

#endif // CUSTOMTABLEWIDGET_H

Cpp:

#include "customtablewidget.h"

#include <QMouseEvent>
#include <QItemSelectionModel>

CustomTableWidget::CustomTableWidget(QWidget *parent) :
    QTableView(parent)



void CustomTableWidget::mousePressEvent(QMouseEvent *event)

    QModelIndex clickedIndex = this->indexAt(QPoint(event->x(), event->y()));

    bool isShiftClicked = Qt::LeftButton == event->button() && (event->modifiers() & Qt::ShiftModifier);
    if (clickedIndex.isValid() && isShiftClicked)
    
        bool isRowSelected = this->selectionModel()->isRowSelected(clickedIndex.row(),
                                                                   clickedIndex.parent());
        if (!isRowSelected)
        
            QModelIndex initialIndex = this->model()->index(0, 0);
            this->selectionModel()->clear();
            this->selectionModel()->select(QItemSelection(initialIndex, clickedIndex),
                                           QItemSelectionModel::Select);
            event->accept();
            return;
        
    

    QTableView::mousePressEvent(event);

【讨论】:

以上是关于如何在 Qt QTableView 中设置 Shift + 单击选择的初始索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pyqt4 中设置 QTableView 标头名称

如何使用 pyside 在 QtableView 单元格中设置数据

在 QTableView 中设置 QPlainTextEdit 委托的高度

使用 PySide2 在 QTableView 中设置文本样式

如何在 Visual Studio 2010 中设置 Qt 路径?

如何在qt中设置.exe文件的属性?