我有一个包含三列的QTableView,如下例所示:
| 编号 | 名称 | ACoord |
无论我仅在ACoord中单击哪个单元格,我都试图突出显示整个“ ACoord”列。
我尝试了几个示例,但没有任何帮助。
最有前途的(也来自官方QT文档)似乎是setSelectionBehavior(QAbstractItemView::SelectColumns)
,但并不能完全满足我的需要。
以下是代码段:
connect(mTurnIntoExcelData, &QAction::triggered, [&]() {
int row = -1, column = -1;
QString reference;
QString type;
QModelIndex index;
int rowModel = index.row();
SelectionData currentData;
for(int i = 0; i < ui->tableViewLeft->model()->columnCount(); i++)
{
if(ui->tableViewLeft->model()->headerData(i, Qt::Horizontal).toString() == "ACoord") {
column = i;
ui->tableViewLeft->setSelectionBehavior(QAbstractItemView::SelectColumns);
ui->tableViewLeft->setSelectionMode(QAbstractItemView::SingleSelection);
type = "ACoord";
}
预期结果是:单击ACoord的任何单元格,整个列将变为可选。
但是,实际结果是,如果我单击ACoord列的任何单元格,则无法选择整个列,而只能选择单个单元格。
感谢您的见解。
答案 0 :(得分:0)
我不知道这是否是最优雅的方法,但是通过修改Qt的“ FrozenColumn”示例程序(在$ QTDIR / qtbase /中),我能够(想要的是)获得想要的行为。示例/小工具/ itemviews / frozencolumn),方法如下:
在freezetablewidget.h
的{{1}}部分中添加以下声明:
private slots:
在void currentColumnChanged(const QModelIndex &);
void autoSelectMagicColumn();
中,在顶部的includes部分中添加一个freezetablewidget.cpp
,然后在#include <QTimer>
方法的末尾添加以下几行:
FreezeTableWidget::init()
...,最后,将以下新行添加到connect(frozenTableView->selectionModel(), SIGNAL(currentColumnChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(currentColumnChanged(const QModelIndex &)));
connect(frozenTableView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(currentColumnChanged(const QModelIndex &))); // optional
中:
freezetablewidget.cpp
通过上述更改,每当我单击该列中的任何单元格(或通过箭头键导航到该列中的任何单元格)时,FrozenColumn示例应用程序都会自动选择整个“ YDS”列。也许您可以在程序中做类似的事情。