gpt4 book ai didi

c++ - 删除指向 QMainWindow 的链接时的 Qt 浏览器堆栈

转载 作者:行者123 更新时间:2023-11-28 08:10:25 30 4
gpt4 key购买 nike

我在 QmainWindow 中实现了简单的拖放功能,引用来自 herehere
我想要做的就是接受有效的 url 并在 url 丢失时打开 QDialog。
但是当 url 下垂并且弹出 QDialog 时,浏览器会在后台存储,直到我关闭 QDialog 。这是错误的浏览器应该一直免费。这是我的代码:

void MainWindow::dragMoveEvent(QDragMoveEvent *event)
{

if (event->mimeData()->hasFormat("text/html"))
{
event->acceptProposedAction();
}
else
{
event->ignore();
}
}
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
// accept just text/uri-list mime format
if (event->mimeData()->hasFormat("text/html"))
{
event->acceptProposedAction();
}
else
{
event->ignore();
}
}
void MainWindow::dragLeaveEvent(QDragLeaveEvent *event)
{

event->accept();


}
void MainWindow::dropEvent(QDropEvent *event)
{
QList<QUrl> urlList;
QString fName;
QStringList pathList;
QFileInfo info;
QString suffix;

if (event->mimeData()->hasFormat("text/html"))
{
urlList = event->mimeData()->urls(); // returns list of QUrls
// if just text was dropped, urlList is empty (size == 0)

if ( urlList.size() > 0) // if at least one QUrl is present in list
{
QString url = urlList.at(0).toString();
event->acceptProposedAction();
openDialog(url); // THIS IS THE FUNCTION THAT I OPEN THE QDIALOG window


}
}
//event->acceptProposedAction();
}

void MainWindow::openDialog(QString& slink)
{

QHash<QString,QVariant> DataMap;
QString link = slink;
DataMap.insert("m_webpage",link);

PublishToDialog* pPublishToDialog = new PublishToDialog(this);
pPublishToDialog->Init(DataMap);
if(pPublishToDialog->exec() != QDialog::Accepted)
{

}
}

当我删除对 QDialog 的调用时,一切正常。并且浏览器不会卡住。我什至按照建议尝试再次使用信号/插槽当我在 drop 调用浏览器时启动 QDialog 时卡住了!

最佳答案

PublishToDialog 到底是什么?我假设它是您的自定义对话框实现,它继承了 QDialog。并给出这一行:

pPublishToDialog->exec() != QDialog::Accepted

这会将对话框打开为模式对话框。模态对话框是阻塞的,它将阻塞当前线程的执行,直到对对话框执行某些操作。您应该使用非模态对话框,而不是使用模态对话框。因为我仍然不确定 PublishToDialog 是否继承了 QDialog 或其他什么,所以我只是假设它是。以下是您可以执行的操作:

PublishToDialog* pPublishToDialog = new PublishToDialog(this);

// Make it a non-modal dialog
pPublishDialog->setModal(false);

// Connect it to a slot to handle whenever the user performs some action on it
QObject::connect(pPublishDialog, SIGNAL(finished()), this, SLOT(handleDialogAction());
pPublishDialog.show();

您必须在您的代码中实现handleDialogAction。同时,您可能希望使 pPublishDialog 成为类成员,因为您需要它来访问 handleDialogAction 中的 QDialog::r​​euslt

关于c++ - 删除指向 QMainWindow 的链接时的 Qt 浏览器堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9257266/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com