我有一个 QTableWidgetSelectionMode
设置为SingleSelection
,并SelectionBehavior
设置为SelectColumns
。这意味着只能选择一列。
但后来我需要找出选择了哪一列,我唯一可以使用的函数是selectedIndexes()
or selectedItems()
,这两个函数都返回整个列表,这很浪费。
有没有办法更有效地做到这一点?
我有一个 QTableWidgetSelectionMode
设置为SingleSelection
,并SelectionBehavior
设置为SelectColumns
。这意味着只能选择一列。
但后来我需要找出选择了哪一列,我唯一可以使用的函数是selectedIndexes()
or selectedItems()
,这两个函数都返回整个列表,这很浪费。
有没有办法更有效地做到这一点?
您使用 selectedItems() 的方法是正确的。由于 QT 无法知道您已将小部件设置为单行/列选择,因此它提供了这些功能以返回QList<>
.
在您的情况下,您可以使用.first()
.
尽管我建议使用信号currentColumnChanged()
在您的应用程序中做出反应
(http://harmattan-dev.nokia.com/docs/library/html/qt4/qitemselectionmodel.html#currentColumnChanged)
您始终可以通过以下方式遍历所选行的所有列selectionModel()->isColumnSelected()
(http://qt-project.org/doc/qt-4.8/qitemselectionmodel.html#isColumnSelected)
connect(tableWidget, SIGNAL(currentCellChanged(int,int,int,int), this, SLOT(onCellChanged(int,int,int,int)));
void Class::onCellChanged(int curRow, int curCol, int preRow, int preCol)
{
current_Col = curCol;
// curRow, preRow and preCol are unused
}
connect(tableWidget->selectionModel()
, SIGNAL(currentColumnChanged(QModelIndex,QModelIndex))
, SLOT(onColumnChanged(QModelIndex)));
...
void Class::onColumnChanged(const QModelIndex &index)
{
int col = index.column();
}
似乎函数selectedRanges()可以满足我的需要。它返回所选范围的列表,但由于它是单列,因此该列表将只有一个项目(因此它很有效,不需要创建大列表)。
int column = ui->tableWidget->selectedRanges().front().leftColumn();
currentColumn() 返回当前选定列的 int。