带虚拟键盘的 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" 完全可行。
有没有办法检测文件名文本编辑何时获得焦点? 我需要在输入文本编辑时显示虚拟键盘
谢谢
这不是一个确切的解决方案,但这里有一个相当 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" 完全可行。