代码之家  ›  专栏  ›  技术社区  ›  Cody Pritchard

Qt文件夹浏览器多次打开

  •  1
  • Cody Pritchard  · 技术社区  · 9 年前

    我有一个QtGUI应用程序,还有一个浏览输出文件夹的按钮。 但有一个bug我想不通。 当你启动应用程序并单击浏览器按钮时,它工作正常,你可以关闭它等。 然后,如果再次单击该按钮,将打开一个浏览器窗口,您可以选择文件夹,但这一次当您关闭它时,该窗口将立即再次出现。 如果你重复这个步骤,它将使你关闭它3次、4次等。

    我一直无法理解为什么我现在的代码会出现这种情况。

    void Dialog::on_outputFolderBrowseBtn_pressed()
    {
        QObject::connect(ui->outputFolderBrowseBtn, SIGNAL(clicked()), this, SLOT(BrowseOutputFolder()));
    }
    
    void Dialog::BrowseOutputFolder()
    {
        QFileDialog dialog;
        dialog.setFileMode(QFileDialog::Directory);
        dialog.setOption(QFileDialog::ShowDirsOnly);
    
        QString folderName = QFileDialog::getExistingDirectory(this, tr("Output folder"), "", QFileDialog::ShowDirsOnly);
        if(folderName.size() != 0)
        {
            QDir folder(folderName);
            if(!folder.exists())
            {
                SecureLogger::Instance()->LogError("Folder does not exist ", __FILE__, __LINE__);
            }
            ui->OutputFolderPath->setText(folderName);
        }
    }
    

    我已经通过调试器运行了它,它一直跳回到这行:

    QString folderName = QFileDialog::getExistingDirectory(this, tr("Output folder"), "", QFileDialog::ShowDirsOnly);
    

    有人知道为什么会这样吗?

    编辑:我已经解决了这个问题,但不一定能解决这个问题。 现在,我只是在单击按钮时添加了一个bool标志。所以代码现在看起来像这样:

    void Dialog::on_outputFolderBrowseBtn_pressed()
    {
        m_clicked = true;
        QObject::connect(ui->outputFolderBrowseBtn, SIGNAL(clicked()), this, SLOT(BrowseOutputFolder()));
    }
    
    void Dialog::BrowseOutputFolder()
    {
        QString folderName;
        if (m_clicked)
        {
            folderName = QFileDialog::getExistingDirectory(this, tr("Select Folder"), "", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
            m_clicked = false;
        }
        if(!folderName.isEmpty())
        {
            QDir folder(folderName);
            if(!folder.exists())
            {
                SecureLogger::Instance()->LogError("Folder does not exist ", __FILE__, __LINE__);
            }
            ui->OutputFolderPath->setText(folderName);
        }
    }
    

    这只是一个简单的问题,并没有告诉我一开始是什么问题,所以如果能深入了解为什么这条线路会被反复调用,我们将不胜感激。

    1 回复  |  直到 9 年前
        1
  •  4
  •   Leiaz    9 年前

    名称 on_outputFolderBrowseBtn_pressed 意味着 this is a slot called when the button is pressed 。在其中,您正在连接 clicked 同一个按钮与插槽的信号。每次按下按钮时都会创建一个新的连接,因此您最终可以拨打尽可能多的电话 BrowseOutputFolder 当你按下按钮时。

    只需调用您的插槽,而不是连接它。