gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:30 25 4
gpt4 key购买 nike

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

如何修复 Tab 键顺序以表示布局顺序?我已经尝试遍历列表元素并在每个相邻对上使用 setTabOrder(),但没有成功。

关于实现的更多细节:

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

更新:添加了 MCVE!

以下缩小的示例演示了该问题。为了完整起见,我还包含了 header 、主要函数和 .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 = createButtonProxy("button 1", this);
QWidget* button2 = createButtonProxy("button 2", this);
QWidget* button3 = createButtonProxy("button 3", this);
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);

// now insert a fourth button in between the others - incorrect tab order!
QWidget* buttonInbetween = createButtonProxy("button in between", this);
layout->insertWidget(1, buttonInbetween);

// attempt to correct tab order - not working, even with focus proxy set...
setTabOrder(button1, buttonInbetween);
setTabOrder(buttonInbetween, button2);
}

TabOrderTestWindow.h:

#ifndef TABORDERTESTWINDOW_H
#define TABORDERTESTWINDOW_H

#include <QMainWindow>

class TabOrderTestWindow : public QWidget
{
Q_OBJECT

public:
TabOrderTestWindow();
};

#endif // TABORDERTESTWINDOW_H

main.cpp:

#include "TabOrderTestWindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TabOrderTestWindow w;
w.show();

return a.exec();
}

TabOrderTest.pro:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = TabOrderTest
TEMPLATE = app


SOURCES += main.cpp\
TabOrderTestWindow.cpp

HEADERS += TabOrderTestWindow.h

最佳答案

这似乎确实是一个错误,因为文档声明焦点代理会得到处理。

但我们可以自己照顾它们,方法是:

setTabOrder(button1->focusProxy(), buttonInbetween->focusProxy());
setTabOrder(buttonInbetween->focusProxy(), button2->focusProxy());

看来您需要做 Qt 应该为您做的事情。

关于c++ - 在 QT 的布局中插入小部件后修复选项卡顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33760978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com