2012-02-13 10 views
0

私はherehere
から取らQmainWindow参照実装、簡単なドラッグ&ドロップ機能を持っているへのリンクを削除するとき、私がやりたいすべてのURLが低下したときに有効なURLとオープンQDialogを受け入れることです。
URLが垂れ下がってQDialogがポップアップすると、QDialogを閉じるまでブラウザがバックグラウンドで保管されます。これは間違っているブラウザは、すべての時間を無料にする必要があります。ここ は私のコードです:QtのブラウザスタックQMainWindow

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への呼び出しを削除する場合。 とブラウザがスタックしません。私は信号/スロットを再度使用して示唆されたようにtryupされました 私はQDialogを開始すると、ブラウザが立ち往生したときにドロップされました!

答えて

1

正確にはPublishToDialogとは何ですか?私はそれがQDialogを継承するあなたのカスタムダイアログ実装であると仮定します。この行は、

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

modal dialogと表示されます。モーダルダイアログがブロックされ、ダイアログで何らかのアクションが実行されるまで、現在のスレッドの実行がブロックされます。モーダルダイアログを使用する代わりに、非モーダルダイアログを使用する必要があります。 PublishToDialogQDialogを継承するかどうかまだわからないので、私はそれだけであると仮定しようとしています。ここでは、何ができるかです:

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を実装する必要があります。同時にQDialog::reuslthandleDialogActionでアクセスするために、pPublishDialogをクラスメンバーにする必要がある場合もあります。

+0

QDialogの実装であり、QMainWindowをブロックするモーダルダイアログとして機能したいと思います。私がリンクを引っ張ったブラウザではありません。私の場合、ブラウザはPublishToDialog(QDIalog)ウィンドウを閉じるまでスタックされています – user63898

+0

私はあなたが提案したものを試しましたが、それでもなお良いことはありません。私は信号/スロットを使用してブラウザがスタックしている場合でも。 QDialogが問題です。私は、すべてのものがうまく動作しているコールを削除するとき。 – user63898

+1

pastebinなどにコードを投稿できますか?信号/スロットを持つクラス全体と同様?モーダルダイアログは、QApplicationがイベントループを実行するメインスレッドをブロックするため、できません。あなたはそれをブロックし、すべてが詰まってしまいます。 –

関連する問題