加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在QT中的布局中插入小部件后修复Tab键顺序

发布时间:2020-12-16 07:14:21 所属栏目:百科 来源:网络整理
导读:我在QT 5.5中有一个自定义列表实现(QWidget的子类).列表的元素使用QVBoxLayout组织.在运行时,元素(也是QWidgets)可以在布局中的任何位置动态添加到列表中或从列表中删除.这个工作正常,除了一个细节:插入的可聚焦元素的Tab键顺序是错误的.插入的最后一个元素
我在QT 5.5中有一个自定义列表实现(QWidget的子类).列表的元素使用QVBoxLayout组织.在运行时,元素(也是QWidgets)可以在布局中的任何位置动态添加到列表中或从列表中删除.这个工作正常,除了一个细节:插入的可聚焦元素的Tab键顺序是错误的.插入的最后一个元素将始终是Tab键顺序中的最后一个元素,即使插入其他两个元素之间也是如此.

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

有关实施的更多细节:

>小部件不会直接添加到列表中.每次添加一个小部件时,都会创建并添加一个代理小部件,“真实”小部件将被重新分配给代理(代理正在做一些图形化的东西).
> QVBoxLayout :: insertWidget()用于插入代理小部件,然后调用QWidget :: show()
>删除元素时,元素将被隐藏,从代理中删除,代理将从列表布局中删除并取消分配
>可聚焦小部件可以是添加到列表中的元素的对象树中的任何位置,它们不一定是元素本身

更新:添加了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应该为你做的事情.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读