微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Qt QTableVew 选择多行

如何解决Qt QTableVew 选择多行

我遇到了 QTableView(Qt 版本 5.12.10)的问题。我创建了一个非常基本的表类,它在类构造函数中只有以下代码

Screen shot

setModel(pModel); // pModel is of a class derived from QAbstractTableModel
setwindowTitle("The Title");
setSelectionBehavior(QAbstractItemView::SelectRows);
setSelectionMode(QAbstractItemView::ExtendedSelection);

当我点击最左边的列(不是 id 列)时,它会显示 2,它会选择整个第 2 行。
当我 shift 单击第 3 行时,它也会选择整个第 3 行。 当我 shift 单击名字列中的第 4 行(除了最左边的任何列)时,它会选择第 4 行并取消选择第 2 行。

根据文档,这可能是预期行为,但如果所有点击都在 Name 列中执行,则第 2 行不会取消选择。

在执行上述操作后,点击第 8 行,最左边的列会重新选择第 1 行,而其他任何地方的第 8 行都不会重新选择第 1 行。

似乎最左边的列有一个选择值,表格的其余部分无法完全访问。

问题

  1. 我做错了什么吗?
  2. 我是否误解了记录在案的行为?
  3. 有谁知道有没有办法让双方以同样的方式工作?

代码: main.cpp

#include <sstream>
#include <QWidget>
#include <QApplication>
#include <QTableView>
#include "cmodeldata.h"
#include "cqtableview.h"

/// display the row from a QItemSelection
std::string dumpQItemSelection (const QItemSelection& selection)
{
    int lastRow = -1;
    std::stringstream output;
    output << "(";
    for (auto index : selection.indexes())
    {
        if (index.row() != lastRow)
        {
            lastRow = index.row();
            output << index.row() << ",";
        }
    }
    output << ")";
    return output.str();
}

int main(int argc,char *argv[])
{
    QApplication a(argc,argv);
    CModelData m_model;
    CQTableView *m_table = new CQTableView (&m_model);
    m_table->show();

    return a.exec();
}

cqtableview.h

#ifndef CQTABLEVIEW_H
#define CQTABLEVIEW_H

#include <QWidget>
#include <QTableView>
#include "cmodeldata.h"

class CQTableView : public QTableView
{
    Q_OBJECT
public:
    explicit CQTableView(CModelData* pModel = nullptr,QWidget *parent = nullptr)
        : QTableView(parent)
    {
        setModel(pModel);
        setwindowTitle("The Title");
        setSelectionBehavior(QAbstractItemView::SelectRows);
        setSelectionMode(QAbstractItemView::ExtendedSelection);
    }

public slots:
public:
};

#endif // CQTABLEVIEW_H

cmodeldata.h

#ifndef CMODELDATA_H
#define CMODELDATA_H

#include <QAbstractTableModel>
#include <QStringListModel>


class CModelData : public QAbstractTableModel
{
    Q_OBJECT
public:
    enum class EColumns
    {   // The order of the columns
          eId = 0,eFirstName,eLastName,eEmail,ePhone,eColumnCount
    };
public:
    CModelData(QObject *parent = nullptr);

    /// Get the number of rows in the data source
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    /// Get the number of columns in the data source
    int columnCount(const QModelIndex &parent = QModelIndex()) const override;

    /// Return a cell of data
    QVariant data(const QModelIndex &index,int role = Qt::displayRole) const override;

    /// Return a cell of data relevent to the header
    QVariant headerData(int section,Qt::Orientation orientation,int role) const;
    /// Add a row of data
    bool addRow (const int i,const QString& fn,const QString& ln,const QString& e,const QString& pn);
private:
    struct DaTarow
    {   // This is a row of data
        int     id;
        QString firstName;
        QString lastName;
        QString email;
        QString phone;
        DaTarow (const int i = 0,const QString& fn = "",const QString& ln = "",const QString& e = "",const QString& pn = "")
            : id(i),firstName(fn),lastName(ln),email(e),phone(pn)
        {}
    };
    QVector<DaTarow> m_rows;
};

#endif // CMODELDATA_H

cmodeldata.cpp

#include "cmodeldata.h"

CModelData::CModelData(QObject* pParent)
    : QAbstractTableModel(pParent)
{
    addRow(0,"Alan","Alanson","alan@email.com","0111 111111");
    addRow(1,"Bob","brown","bob@email.com","0111 222222");
    addRow(2,"Charlie","Carlson","charlie@email.com","0111 333333");
    addRow(3,"Dave","Davis","dave@email.com","0111 444444");
    addRow(4,"Eric","Ericson","eric@email.com","0111 555555");
    addRow(5,"Frank","Fallows","frank@email.com","0111 666666");
    addRow(6,"Geoff","Geofferson","geoff@email.com","0111 777777");
    addRow(7,"Hugo","Hadron","hugo@email.com","0111 888888");
    addRow(8,"Ian","Indigo","ian@email.com","0111 999999");
    addRow(9,"James","Jamerson","james@email.com","0111 000000");
}

int CModelData::rowCount(const QModelIndex & /*parent*/) const
{
   return m_rows.count();
}

int CModelData::columnCount(const QModelIndex & /*parent*/) const
{
    return static_cast<int>(EColumns::eColumnCount);
}

QVariant CModelData::data(const QModelIndex &index,int role) const
{
    if (role == Qt::displayRole)
    {
        /// return QString("Row%1,Column%2").arg(index.row() + 1).arg(index.column() +1);
        for (auto& item : m_rows)
        {
            if (item.id == index.row())
            {
                switch (index.column())
                {
                case static_cast<int>(EColumns::eId):
                    return item.id;
                case static_cast<int>(EColumns::eFirstName):
                    return item.firstName;
                case static_cast<int>(EColumns::eLastName):
                    return item.lastName;
                case static_cast<int>(EColumns::eEmail):
                    return item.email;
                case static_cast<int>(EColumns::ePhone):
                    return item.phone;
                default:
                    return QVariant();
                }
            }
        }
    }
    return QVariant();
}

QVariant CModelData::headerData(int section,int role) const
{
    if (role == Qt::displayRole && orientation == Qt::Horizontal)
    {
        switch (section)
        {
        case static_cast<int>(EColumns::eId):
            return QString("Id");
        case static_cast<int>(EColumns::eFirstName):
            return QString("First Name");
        case static_cast<int>(EColumns::eLastName):
            return QString("Last Name");
        case static_cast<int>(EColumns::eEmail):
            return QString("Email");
        case static_cast<int>(EColumns::ePhone):
            return QString("Phone");
        }
    }
    // return QAbstractTableModel::headerData(section,orientation,role);
    return QAbstractTableModel::headerData(section,role);
}

bool CModelData::addRow (const int i,const QString& pn)
{
    m_rows.append(DaTarow(i,fn,ln,e,pn));
    return true;
}

解决方法

这是 Qt 中的一个错误,我在这里创建了一个错误报告:https://bugreports.qt.io/browse/QTBUG-92561

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。