【问题标题】:Qt Browser stack when dropping link to QMainWindow将链接拖放到 QMainWindow 时的 Qt 浏览器堆栈
【发布时间】:2012-02-13 08:09:13
【问题描述】:

我在 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 时,浏览器卡住了!

【问题讨论】:

    标签: c++ qt drag-and-drop


    【解决方案1】:

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

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

    这会以modal dialog 的形式打开对话框。模态对话框正在阻塞,并将阻塞当前线程的执行,直到对对话框执行某些操作。您应该使用非模态对话框,而不是使用模态对话框。由于我仍然不确定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::reuslt

    【讨论】:

    • 它是 QDialog 的实现,我希望它能充当阻止 QMa​​inWindow 的模态对话框。但不是我从中拖动链接的浏览器。在我的情况下,浏览器是堆栈,直到我关闭 PublishToDialog (QDIalog) 窗口
    • 我试过你的建议,但还是不行。即使我使用信号/插槽浏览器卡住了。 QDialog 是问题所在。当我取消通话时,一切正常。
    • 您可以将您的代码发布到 pastebin 或其他什么地方吗?喜欢带有信号/插槽的整个班级吗?不,您的建议是不可能的,因为模式对话框将阻塞 QApplication 运行其事件循环的主线程。你阻止它,一切都会卡住。
    • 找到了解决办法,简单使用QDialog的open()方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    相关资源
    最近更新 更多