2015-08-05 9 views
1

У меня есть приложение Qt GUI, и у меня есть кнопка для поиска выходной папки. Но есть ошибка, которую я не могу понять. Когда вы запустите приложение и нажмите кнопку браузера, он отлично работает, и вы можете закрыть его и т. Д. Затем, если вы нажмете кнопку во второй раз, откроется окно браузера, и вы можете выбрать папку, но на этот раз, когда вы закроете он, окно сразу появляется снова во второй раз. И если вы повторите это, это заставит вас закрыть его 3 раза, 4 раза и т. Д.Открытие браузера папки Qt более одного раза

Я не мог понять, почему это происходит с кодом, который у меня есть на данный момент.

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); 

Может кто-нибудь понять, почему это происходит?

EDIT: Я исправил проблему, но не обязательно решил проблему. На данный момент я просто добавил флаг 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); 
    } 
} 

Это просто халтура вокруг и оленьей кожи сказать мне, что случилось, в первую очередь, так что любое понимание о том, почему эта линия была вызывалась снова и было бы весьма признателен ,

ответ

4

Название on_outputFolderBrowseBtn_pressed означает, что this is a slot called when the button is pressed. В нем вы подключаете сигнал clicked той же кнопки с вашим слотом. Новое соединение создается каждый раз, когда вы нажимаете кнопку, поэтому вы получаете столько звонков на ваш BrowseOutputFolder слот, когда вы нажимали кнопку.

Просто позвоните в свой слот, а не подключайте его.

 Смежные вопросы

  • Нет связанных вопросов^_^