如何解决Qt QTableVew 选择多行
我遇到了 QTableView(Qt 版本 5.12.10)的问题。我创建了一个非常基本的表类,它在类构造函数中只有以下代码:
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 行。
似乎最左边的列有一个选择值,表格的其余部分无法完全访问。
问题:
- 我做错了什么吗?
- 我是否误解了记录在案的行为?
- 有谁知道有没有办法让双方以同样的方式工作?
代码: 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 举报,一经查实,本站将立刻删除。