我自定义了一个对话框,按下 Tab 键时,焦点从按钮切换到表格小部件。我希望在遍历完表格小部件中的所有项目后,焦点返回到初始按钮。这是一个最小的可重现示例:
#include <QApplication>
#include <QPushButton>
#include <QTableWidget>
#include <QVBoxLayout>
class Widget : public QWidget
{
public:
explicit Widget()
{
setLayout(&vl);
tw.setRowCount(1);
tw.setColumnCount(3);
vl.addWidget(&btn);
vl.addWidget(&tw);
}
bool focusNextPrevChild(bool next)
{
QWidget* focusWidget = this->focusWidget();
if (focusWidget == &tw)
{
int currentRow = tw.currentRow();
int currentCol = tw.currentColumn();
int lastRow = tw.rowCount() - 1;
int lastCol = tw.columnCount() - 1;
if (next && currentRow == lastRow && currentCol == lastCol)
{
tw.clearFocus();
return true;
}
}
return QWidget::focusNextPrevChild(next);
}
private:
QPushButton btn;
QTableWidget tw;
QVBoxLayout vl;
};
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
我尝试重写该focusNextPrevChild
函数,但没有成功。一旦焦点进入表格小部件,它就无法离开它。
musicamante 说:
您可以通过添加
qDebug
来检查是否签focusWidget
入focusNextPrevChild
。if (focusWidget == &tw)
支票永远不会是true
。您可以使用以下方法
moveCursor()
来实现您想要的目标:moveCursor
这里替换了里面的逻辑focusNextPrevChild
,并使用已经可用的替换了对下一个/上一个的检查QAbstractItemView::CursorAction
。此方法适用于基本小部件单元格。因此,我认为没有必要重新实现
focusNextPrevChild
。当您的单元格小部件很复杂并且想要自定义其中的选项卡导航顺序时,您可能需要这样做。但根据您在其中实现的逻辑focusNextPrevChild
,基本方法应该足够了。示范: