Qtableview 表格点击过再点击后 表格的焦点会自动移动到最后一个 C++ QT
时间: 2023-06-26 08:08:55 浏览: 71
您可以在QTableView的槽函数中通过调用QModelIndex的isValid()函数来判断 QModelIndex 对象是否可用。如果可用,可以使用QTableView的scrollTo函数将焦点自动滚动到最后一个单元格。下面是示例代码:
```cpp
void MyTableView::slotClicked(const QModelIndex &index)
{
if (index.isValid()) {
scrollTo(index, QAbstractItemView::EnsureVisible);
}
}
```
在您的代码中,将`MyTableView`替换为您的QTableView子类的名称,并将其与您的槽函数进行连接,如下所示:
```cpp
connect(tableView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(slotClicked(const QModelIndex &)));
```
这样,当用户单击表格中的单元格时,如果该单元格可用,则焦点将滚动到该单元格,并确保该单元格可见。
相关问题
Qtableview 表格点击过再点击后 表格的焦点会自动移动到最后一个
这个问题可能是由于您在处理表格点击事件时,将焦点设置为了最后一行。您可以在处理表格点击事件时,避免将焦点设置为最后一行,以解决该问题。
以下是一个示例代码,可以在表格点击事件中获取所点击的行和列号,以及当前焦点所在的行号:
```
void MyTableView::mousePressEvent(QMouseEvent* event)
{
int row = this->rowAt(event->pos().y());
int col = this->columnAt(event->pos().x());
int currRow = this->currentIndex().row();
// do something with row, col and currRow
}
```
在这里,我们使用 `rowAt()` 和 `columnAt()` 函数来获取所点击的行和列号。然后,我们可以使用 `currentIndex()` 函数获取当前焦点所在的行号。在处理完表格点击事件后,不要设置焦点,以避免自动移动焦点到最后一行。
```
void MyTableView::mousePressEvent(QMouseEvent* event)
{
int row = this->rowAt(event->pos().y());
int col = this->columnAt(event->pos().x());
int currRow = this->currentIndex().row();
// do something with row, col and currRow
// don't set focus to avoid moving the focus to the last row
event->ignore();
}
```
这样,就可以避免在再次点击表格时,将焦点自动移动到最后一行。
QT Qtableview 表格点击过再点击后 表格的焦点会自动移动到最后一个是什么原因
这种情况可能是表格的 "EditTriggers" 属性设置了 "CurrentChanged" 或 "SelectedClicked"。这将导致在单元格中编辑后,焦点将自动移动到下一个单元格或表格的最后一行。
可以尝试将 "EditTriggers" 属性设置为 "DoubleClicked",这样只有在第二次单击单元格时才会发生编辑,而不是在第一次单击时。或者可以在点击单元格时手动设置表格的 "CurrentIndex" 属性,以避免焦点自动移动。例如:
```python
table.setCurrentIndex(index) # index 是要设置的单元格的索引
```
另外,也可以查看表格的 "SelectionBehavior" 属性是否设置为 "SelectRows",这可能会影响焦点的行为。