【发布时间】:2013-01-21 13:46:20
【问题描述】:
你可能会说我对 QT 很陌生...
我的程序在 QGridLayout 中包含一个带有多个小部件的窗口。其中一些小部件本身具有布局和子小部件。按 Tab 键会按照我创建小部件的顺序移动焦点。
当小部件更改其内容时会出现问题(我通过删除所有子小部件然后构建新小部件来做到这一点。)如果我这样做,新小部件将移动到选项卡链的末尾(这表明我,选项卡顺序是一种全局的窗口)。我尝试使用 QWidget::setTabOrder() 重新排序所有小部件(我尝试了两种方法,只为主窗口的竞争设置标签顺序并为子窗口设置它)但实际顺序没有改变。我通过在小部件的竞争发生变化时发出信号并将其连接到我的主窗口上的插槽来做到这一点。 我想我理解 setTabOrder() 函数的工作方式。我做了类似的事情:
QWidget* a = firstWidget;
QWidget* b = secondWidget;
QWidget::setTabOrder(a,b);
for (int i = 0; i < widgets.size(); ++i) {
a = b;
b = widgets[i];
QWidget::setTabOrder(a,b);
}
在更改 Tab 键顺序时有什么特别需要做的吗?
我还尝试重新实现 focusNextPrevChild(bool next) 和 focusInEvent(QFocusEvent* e) 类似于可以在此站点上找到的内容。 1
我设法弄乱了标签顺序,更像这样......这种方法是朝着正确方向迈出的一步吗?
如果这是我设法错过的简单事情,我很抱歉,但我现在苦苦挣扎了一段时间,找不到解决方案。 非常感谢任何帮助。
【问题讨论】:
-
我不确定这是否能解决问题,但如果
firstWidget与widgets[0]相同,您的循环应该从 1 开始 -
widgets是如何填充的,它包含哪些小部件?只有更改其内容的小部件的子级,还是主布局的所有小部件? -
您有一些已删除的小部件,还有一些新的小部件。例如,您有 1、2、3、4、5 个小部件,但接下来您有 1、2、5 个小部件,而 6、7 是新的小部件。如果将 Tab 键顺序设置为 1、2、6、7、5 会怎样?
-
@TimMeyer 我都试过了,还从布局中拉出小部件。 (我使用了 QGridLayout::itemAtPosition(),然后使用了 QLayoutItem::Widget(),对孩子也是如此。)
-
@Milovidov 这就是我尝试做的,但我无法让它发挥作用。
标签: qt user-interface tab-ordering