相关疑难解决方法(0)

在QT的布局中插入小部件后修复选项卡顺序

QWidget在QT 5.5中有一个自定义列表实现(的子类)。列表的元素使用进行组织QVBoxLayout。在运行时,QWidget可以在布局中的任何位置将元素(也为)动态添加到列表或从列表中删除。除一个细节外,此方法工作正常:插入的可聚焦元素的制表符顺序错误。即使插入到其他两个元素之间,最后插入的元素也始终是制表符顺序中的最后一个元素。

如何固定制表符顺序来表示布局顺序?我已经尝试遍历列表元素并setTabOrder()在每个相邻对上使用,但没有成功。

有关实现的更多详细信息:

  • 窗口小部件不会直接添加到列表中。每次应该添加一个小部件时,都会创建并添加一个代理小部件,而“真实”小部件将被重新代理到该代理(该代理正在执行一些图形处理)。
  • QVBoxLayout::insertWidget() 用于插入代理窗口小部件,然后调用 QWidget::show()
  • 删除元素时,该元素将被隐藏,从代理中删除,该代理从列表布局中删除并释放
  • 可聚焦的小部件可以位于添加到列表中的元素的对象树中的任何位置,它们不一定是元素本身

更新:添加了MCVE!

以下精简示例演示了该问题。为了完整起见,我还包括了标题,主函数和.pro文件。如果您不想重现此问题,则可以安全地跳过这些文件,TabOrderTestWindow.cpp是重要的问题。

TabOrderTestWindow.cpp:

#include "TabOrderTestWindow.h"

#include <QVBoxLayout>
#include <QPushButton>

// create a button inside a proxy widget
QWidget* createButtonProxy(const QString& caption, QWidget* parent) {
    QWidget* proxy = new QWidget(parent);
    QPushButton* button = new QPushButton(caption, proxy);
    proxy->setFocusProxy(button);
    return proxy;
}

TabOrderTestWindow::TabOrderTestWindow()
    : QWidget()
{
    setMinimumHeight(200);
    setMinimumWidth(350);

    QVBoxLayout* layout = new QVBoxLayout(this);

    // create and add 3 buttons in order
    QWidget* button1 = …
Run Code Online (Sandbox Code Playgroud)

c++ layout qt widget tab-ordering

5
推荐指数
1
解决办法
2487
查看次数

标签 统计

c++ ×1

layout ×1

qt ×1

tab-ordering ×1

widget ×1