我使用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中在焦点序列中标记的条目更多。实际的可聚焦小部件将稀疏编号。(在上面的函数中添加调试打印输出可以查看所有内容。)