QFileDialog::getOpenFileName in console application

QFileDialog::getOpenFileName in console application

本文关键字:application console getOpenFileName QFileDialog in      更新时间:2023-10-16

这是一个第一次发布在 qtforum.org 上的问题,我没有答案:

使用"打开"对话框后,我在控制台应用程序中隐藏该对话框时遇到问题。以下是用于测试此行为 main.cc 文件的内容:

#include <QApplication>
#include <QFile>
#include <QFileDialog>
#include <QString>
bool b_closing = false;
static QString gofn ( void )
{
    QString    s_file;
    s_file = QFileDialog::getOpenFileName(
            qApp->activeWindow(),
            QObject::tr( "Select the file to open:" )
            );
    if ( !s_file.isEmpty() )
    {
        /* ... */
    }
    /* have no effect; */
    QApplication::processEvents();
    QApplication::sendPostedEvents();
    return s_file;
}
static void userInpLoop ( void )
{
    QFile    cons_inp;
    QFile    cons_outp;
    QString  s_ln;
    cons_inp.open( stdin, QIODevice::ReadOnly );
    cons_outp.open( stdout, QIODevice::WriteOnly );
    for ( ;; )
    {
        if ( b_closing )
            break;
        cons_outp.write( "n>" );
        cons_outp.flush();
        s_ln = cons_inp.readLine().trimmed();
        if ( s_ln == "q" )
        {
            b_closing = true;
            cons_outp.write( "Closng...n" );
        }
        else if ( s_ln == "gofn" )
        {
            cons_outp.write( gofn().toLatin1() );
        }
        else
        {
            cons_outp.write( "ERROR!!! nInvalid input!n" );
        }
        cons_outp.flush();
        //break; /* just to test that a.exec() hides the dialog */
    }
}
int main( int argc, char *argv[] )
{
    /* we choose QApplication instead of QCoreApplication because we need some Gui components */
    QApplication a(argc, argv);
    userInpLoop();
    //return a.exec(); /* this will hide the dialog */
    return 0;
}

我使用此 .pro 文件构建应用程序:

QT += core gui
TARGET = test_gofn
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cc

操作系统: 乌班图 12.04

Qt:4.8.2 从后备箱构建

你可能想试试

QEventLoop loop; 
while (loop.processEvents()) 
    /* nothing */;

我发现有时有必要再次调用循环......

在Windows 7上,使用Qt4.8.1和Qt4.8.3编译,openDialog是自然的,隐藏的使用后。

你能描述更多,在你身边发生了什么吗?