c – 在QT中的布局中插入小部件后修复Tab键顺序
我在QT 5.5中有一个自定义列表实现(QWidget的子类).列表的元素使用QVBoxLayout组织.在运行时,元素(也是QWidgets)可以在布局中的任何位置动态添加到列表中或从列表中删除.这个工作正常,除了一个细节:插入的可聚焦元素的Tab键顺序是错误的.插入的最后一个元素将始终是Tab键顺序中的最后一个元素,即使插入其他两个元素之间也是如此.
如何修复Tab键顺序以表示布局顺序?我已经尝试迭代列表元素并在每个相邻对上使用setTabOrder(),但没有成功. 有关实施的更多细节: >小部件不会直接添加到列表中.每次添加一个小部件时,都会创建并添加一个代理小部件,“真实”小部件将被重新分配给代理(代理正在做一些图形化的东西). 更新:添加了MCVE! 以下缩小的示例演示了此问题.为了完整起见,我还包括了header,main函数和.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 解决方法
这里似乎是一个错误,因为Doc状态会关注焦点代理.
但是我们可以通过以下方式自己关心它们: setTabOrder(button1->focusProxy(),buttonInbetween->focusProxy()); setTabOrder(buttonInbetween->focusProxy(),button2->focusProxy()); 所以看来你需要做Qt应该为你做的事情. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |