非原生 QFileDialog:将焦点设置到文件列表框,而不是文件名行编辑

发布于 2025-01-17 03:20:52 字数 772 浏览 1 评论 0原文

我需要在非本机模式下使用 QFileDialog (以便能够按照建议的此处)。

但是,在该模式下,它的焦点设置在其底部的文件名编辑行。我发现这段代码,我猜它会导致这样的行为:

//https://code.woboq.org/qt5/qtbase/src/widgets/dialogs/qfiledialog.cpp.html
void QFileDialog::setVisible(bool visible)
{
    ...
    if (!d->nativeDialogInUse)
        d->qFileDialogUi->fileNameEdit->setFocus();

    QDialog::setVisible(visible);
}

但是,我想将焦点设置到文件列表框。即树视图或列表视图,否则该框看起来呈灰色。我不知道为什么Qt开发人员将焦点设置在非原生模式下的文件名行编辑上。也许,这个解决方案背后有一个合理的理由。

我发现了一个相关问题 此处

I need to use QFileDialog in a non-native mode (in order to be able to have a multiselect functionality as proposed here).

However, in that mode it has a focus set to the filename edit line at its bottom. I have found this code, which I guess, results in such a behavior:

//https://code.woboq.org/qt5/qtbase/src/widgets/dialogs/qfiledialog.cpp.html
void QFileDialog::setVisible(bool visible)
{
    ...
    if (!d->nativeDialogInUse)
        d->qFileDialogUi->fileNameEdit->setFocus();

    QDialog::setVisible(visible);
}

However, I would like to set the focus to the file list box. i.e. tree view or list view, as otherwise the box looks grayish. I don't know why Qt developers set the focus to the file name line edit in the non-native mode. Maybe, there is a rationale behind this solution.

I have found a related question here.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

萌辣 2025-01-24 03:20:52

解决方案是重新实现 protected virtual QFileDialog::setVisible(bool)

#include "QtWidgets/QFileDialog"
#include "QtWidgets/QListView"
#include "QtWidgets/QTreeView"

class MyFileDialog final : public QFileDialog
{
    Q_OBJECT

public:
    explicit MyFileDialog(QWidget* parent = nullptr) : : QFileDialog(parent) {}

public: // QFileDialog
    ~MyFileDialog() override = default;

protected:
    void setVisible(bool isVisible) override
    {
        QFileDialog::setVisible(isVisible);

        auto* const listView{findChild<QListView*>("listView")};
        if (nullptr != listView)
        {
            listView->setFocus();
        }

        auto* const treeView{findChild<QTreeView*>()};
        if (nullptr != treeView)
        {
            treeView->setFocus();
        }
    }
};

The solution is to have protected virtual QFileDialog::setVisible(bool) reimplemented:

#include "QtWidgets/QFileDialog"
#include "QtWidgets/QListView"
#include "QtWidgets/QTreeView"

class MyFileDialog final : public QFileDialog
{
    Q_OBJECT

public:
    explicit MyFileDialog(QWidget* parent = nullptr) : : QFileDialog(parent) {}

public: // QFileDialog
    ~MyFileDialog() override = default;

protected:
    void setVisible(bool isVisible) override
    {
        QFileDialog::setVisible(isVisible);

        auto* const listView{findChild<QListView*>("listView")};
        if (nullptr != listView)
        {
            listView->setFocus();
        }

        auto* const treeView{findChild<QTreeView*>()};
        if (nullptr != treeView)
        {
            treeView->setFocus();
        }
    }
};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文