[英]Why QFileDialog::selectFile doesn't work?
我正在使用 Qt 5.12 並嘗試編寫測試(使用 QTest)以打開以某種 xml 格式存儲的項目。
在測試中,我使用QTimer::singleShot
等待QFileDialog
出現在QT close window by QTest in locked thread 中。
問題是QFileDialog::selectFile
沒有選擇任何東西。 這意味着確定按鈕未激活,因此我無法在測試中單擊它。
我假設在以下示例中,文件的完整路徑是/tmp/project.xml
。 請注意, QFileDialog::setDirectory
效果很好:當以下示例開始時,您位於/tmp
目錄而不是/
。
#include <QApplication>
#include <QFileDialog>
#include <QTimer>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTimer::singleShot(300, []() {
QWidget* window = nullptr;
while (!window) {
window = qApp->activeModalWidget();
}
QFileDialog* fd = qobject_cast<QFileDialog*>(window);
fd->setDirectory("/tmp");
fd->selectFile("project.xml");
});
QString path = QFileDialog::getOpenFileName(nullptr, "Open Project",
"/", QString(),
nullptr, QFileDialog::DontUseNativeDialog);
}
由於文件名文本框 (lineEdit) 被聚焦,函數 selectFile 不起作用。 這種行為來自 QFileDialog::selectFile() 的實現:
void QFileDialog::selectFile(const QString &filename)
{
// ... function body
//Put the filename into the lineEdit when :
//1. The dialog is not visible or
//2. The lineEdit is not focused.
if (!isVisible() || !d->lineEdit()->hasFocus())
d->lineEdit()->setText(index.isValid() ? index.data().toString() : fileFromPath(d->rootPath(), filename));
}
要使程序正常工作,有兩種方法:
放棄焦點然后調用 selectFile
fd->setDirectory("/tmp"); QLineEdit * lineEdit = qobject_cast<QLineEdit*>(fd->focusWidget()); if( lineEdit ){ //Method 1 lineEdit->setText("project.xml"); //Method 2 lineEdit->nextInFocusChain()->setFocus(); fd->selectFile("project.xml"); }else { //no lineEdit focus found fd->selectFile("project.xml"); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.