如何选择 QTableView 的特定整个列



我有一个包含三列的 QTableView,如下所示:

| 编号 | 姓名 | 阿科德 |

我正在尝试突出显示整个 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列的任何单元格,则无法选择整个列,而只能选择单个单元格。

感谢您的任何见解。

我不知道

这是否是最优雅的方法,但我能够通过修改Qt的"FrozenColumn"示例程序(在$QTDIR/qtbase/examples/widgets/itemviews/frozencolumn中(来获得(我相信是(你想要的行为如下:

freezetablewidget.h 中,在 private slots: 部分内添加以下声明:

void currentColumnChanged(const QModelIndex &);  
void autoSelectMagicColumn();

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中:

const int magicColumnIndex = 2;  // or whichever column you want the auto-selecting to happen on
void FreezeTableWidget::currentColumnChanged(const QModelIndex & mi)
{
   const int col = mi.column();
   if (col == magicColumnIndex)
   {
      // Auto-select the entire column!  (Gotta schedule it be done later 
      //  since it doesn't work if I just call selectColumn() directly at this point)
      QTimer::singleShot(100, this, SLOT(autoSelectMagicColumn()));
   }
}
void FreezeTableWidget::autoSelectMagicColumn()
{
    // Double-check that the focus is still on the magic column index, in case the user moves fast
    if (selectionModel()->currentIndex().column() == magicColumnIndex) frozenTableView->selectColumn(magicColumnIndex);
}

通过上述更改,每当我单击该列中的任何单元格(或通过箭头键导航到该列中的任何单元格(时,FrozenColumn 示例应用程序将自动选择整个"YDS"列。 也许你可以在你的程序中做类似的事情。

相关内容

  • 没有找到相关文章

最新更新