Cyb*_*ran 5 c++ layout qt widget tab-ordering
我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 = 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);
}
Run Code Online (Sandbox Code Playgroud)
TabOrderTestWindow.h:
#ifndef TABORDERTESTWINDOW_H
#define TABORDERTESTWINDOW_H
#include <QMainWindow>
class TabOrderTestWindow : public QWidget
{
Q_OBJECT
public:
TabOrderTestWindow();
};
#endif // TABORDERTESTWINDOW_H
Run Code Online (Sandbox Code Playgroud)
main.cpp:
#include "TabOrderTestWindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TabOrderTestWindow w;
w.show();
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
TabOrderTest.pro:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = TabOrderTest
TEMPLATE = app
SOURCES += main.cpp\
TabOrderTestWindow.cpp
HEADERS += TabOrderTestWindow.h
Run Code Online (Sandbox Code Playgroud)
这似乎确实是一个错误,因为文档指出焦点代理将得到处理。
但我们可以通过使用以下方法自己照顾它们:
setTabOrder(button1->focusProxy(), buttonInbetween->focusProxy());
setTabOrder(buttonInbetween->focusProxy(), button2->focusProxy());
Run Code Online (Sandbox Code Playgroud)
所以看来你需要做 Qt 应该为你做的事情。