带虚拟键盘的 QFileDialog

QFileDialog with virtual keyboard

有没有办法检测文件名文本编辑何时获得焦点? 我需要在输入文本编辑时显示虚拟键盘

谢谢

这不是一个确切的解决方案,但这里有一个相当 hacky 的方法,导致它,应该工作 -- QFileDialog 也是一个小部件,带有 children,因此您可以访问它filename QLineEdit 并用它做任何需要的事情。

类似... QLineEdit* lineEdit = dlg->findChild<QLineEdit*>(); 消息过滤器会更好,因为它不需要额外的操作或更改对话框的行为。

QLineEdit* lineEdit = dlg->findChild<QLineEdit*>();
FocusEater* filter = new FocusEater(this);
lineEdit->installEventFilter(filter);

connect(filter, &FocusEater::gotFocus, [](){
    QMessageBox::information(nullptr, "FUU", "BAR");
});

你仍然需要在正确的事件处理上搞砸一些,我自己尝试了一个最简单的演示,它成功了:

class FocusEater : public QObject
{
    Q_OBJECT

public:
    explicit FocusEater(QObject* parent)
        : QObject(parent)
    {}

signals:
    void gotFocus();

protected:
    bool eventFilter(QObject *obj, QEvent *event) override
    {
        if (event->type() == QEvent::FocusIn)
        {
            emit gotFocus();
            return true;
        }
        else
            return QObject::eventFilter(obj, event);
    }
};

实际上,根据假定的自定义量,实现自定义文件对话框并不难,但 "focus detection" 完全可行。