获取焦点(或选项卡)顺序



我使用Qt Designer设计了一个用户界面,并使用"编辑选项卡顺序"模式设置了选项卡顺序。

现在我想知道的是(出于其他原因,不那么重要)如何在ui中获得特定QWidget的制表顺序?

我的意思是,如果我有几个小部件,并且说选项卡顺序已经设置好了,有没有一种方法可以做这样的事情:

int nb = widget1->getTabOrder();

无法将选项卡顺序作为整数。如果您查看uic工具从ui文件创建的C++代码,它会调用QWidget::setTabOrder()几次,而该方法只需要两个QWidget指针。因此,Qt内部甚至不将选项卡顺序存储为整数,而是将其存储为QWidget指针的链表。

您可以使用QWidget::nextInFocusChain()QWidget::previousInFocusChain()查询该链表。这为您提供了小部件的整个焦点链,其中包含所有子小部件,顺序正确。然后,您可以通过检查它们的focusPolicy、enabled状态和visible状态来获得真正的选项卡顺序列表,就像QWidget::focusNextPrevChild()函数的内部实现一样。如果你真的需要一个整数索引,你需要自己设计一个算法,从获得的选项卡顺序列表中计算索引。

(有点晚了。)我有一个激动人心的时刻:实际上,确定小部件在选项卡序列中的位置并不困难。它需要使用动态属性;注释";任何QObject。(默认)焦点列表只是一个循环链表,没有可分辨的(我已经看到已标识的)节点。下面的函数用一个从可分辨节点(您选择的)开始的序列号来注释该链表中的所有项目,并在父窗口小部件/对话框中提供一个指向该节点的指针。

从你的setupUi(等等)调用它。(在你可能对焦点序列进行任何更改之后!)参数是你想要排序的小部件/对话框(并在中找到可分辨的节点)和你决定应该是"的小部件;第一个";(杰出的)。

// Add sequence numbers in the tab focus list starting at distinguishedNode
void sequenceFocus(QWidget *root, QWidget* distinguishedNode) 
{
    QVariant v;
    v.setValue(distinguishedNode);
    root->setProperty("focusRoot", v);
    int itemCtr = 0;
    QWidget* i = distinguishedNode;
    do {
        i->setProperty("focusPosition", itemCtr);
        i = i->nextInFocusChain();
        itemCtr++;
    } while (i != distinguishedNode);
}

然后,您可以使用从父项中获取列表中的可分辨(第一个)项目

QWidget* start = activeDialog->property("focusRoot").value<QWidget*>();

并使用获取小部件的序列位置

my_widget->property("focusPosition").toInt()

请注意,(至少)Designer最终在焦点列表中放置的条目比Designer中在焦点序列中标记的条目更多。实际的可聚焦小部件将稀疏编号。(在上面的函数中添加调试打印输出可以查看所有内容。)

最新更新