Qt 文件夹浏览器多次打开
Qt folder browser opening more than once
我有一个 Qt GUI 应用程序,我有一个按钮可以浏览输出文件夹。
但是有一个我无法弄清楚的错误。
当您启动应用程序并单击浏览器按钮时,它工作正常,您可以关闭它,等等。
然后,如果您再次单击该按钮,浏览器 window 打开,您可以 select 文件夹,但这次当您关闭它时, window 立即再次出现。
如果你重复这个,它会让你关闭它 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);
}
}
这只是 hack work around,并没有告诉我首先出了什么问题,所以任何关于为什么一遍又一遍地调用该线路的见解将不胜感激。
名字on_outputFolderBrowseBtn_pressed
的意思是this is a slot called when the button is pressed。在其中,您将同一按钮的 clicked
信号连接到您的插槽。每次按下按钮时都会创建一个新连接,因此您最终会收到与按下按钮一样多的 BrowseOutputFolder
插槽调用。
只需调用您的插槽而不是连接它。
我有一个 Qt GUI 应用程序,我有一个按钮可以浏览输出文件夹。 但是有一个我无法弄清楚的错误。 当您启动应用程序并单击浏览器按钮时,它工作正常,您可以关闭它,等等。 然后,如果您再次单击该按钮,浏览器 window 打开,您可以 select 文件夹,但这次当您关闭它时, window 立即再次出现。 如果你重复这个,它会让你关闭它 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);
}
}
这只是 hack work around,并没有告诉我首先出了什么问题,所以任何关于为什么一遍又一遍地调用该线路的见解将不胜感激。
名字on_outputFolderBrowseBtn_pressed
的意思是this is a slot called when the button is pressed。在其中,您将同一按钮的 clicked
信号连接到您的插槽。每次按下按钮时都会创建一个新连接,因此您最终会收到与按下按钮一样多的 BrowseOutputFolder
插槽调用。
只需调用您的插槽而不是连接它。