Стек Qt Browser при удалении ссылки на QMainWindow - PullRequest
0 голосов
/ 13 февраля 2012

У меня есть простые функции перетаскивания, реализованные в QmainWindow, ссылка взята из здесь и здесь
все, что я хочу сделать, это принять действительный URL и открыть QDialog, когда URL упал.
но когда 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, так что все работает нормально. и браузер не застрял. я даже попробовал, как предложено, используя сигнал / слот поставить снова когда я запускаю QDialog, когда вызывается drop, браузер застрял!

1 Ответ

1 голос
/ 13 февраля 2012

Что именно 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 участником класса, так как он понадобится вам для доступа к QDialog::reuslt в handleDialogAction.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...