代码之家  ›  专栏  ›  技术社区  ›  Alex

如何使qt对话框在锁定用户主窗口时获取信息?

  •  3
  • Alex  · 技术社区  · 15 年前

    我有一个qt主窗口,它将弹出一个对话框,其中有一个“确定”和“取消”按钮。这个对话框有一个简单的微调器,它要求用户输入一个数字,当按下“确定”或“取消”时,这个数字应该返回到主窗口(对于“取消”,它将返回-1)。

    我想在mainwindow.cpp的信号中使用代码,就像这样:

    void mainWindow::slot_openNumberDlg(){
        // Create a new dialog
        numberDlg dlg( this );
    
        // Show it and wait for Ok or Cancel
        if( dlg.exec() == QDialog::Accepted ){
            return;
        }
    }
    

    但是,如果按下按钮时自旋体被破坏,我如何将对话框中自旋体的值返回到主窗口?

    我还考虑了另一种解决方案,我可以在MainWindow的构造函数中初始化对话框,但直到一个信号激活了MainWindow.cpp中的一个槽,它才会显示出来,就像这样:

    // Create as pointer in main.h:
    numberDlg *dlg;
    
    // Initialize pointer and setup listener in constructor (main.cpp):
    mainWindow::mainWindow(){
        dlg = new numberDlg();
        QObject::connect( dlg, SIGNAL( sig_retVal(int) ), ui->widget, SLOT( slot_showNum(int) ) );
    }
    
    // Make a function to handle show/close:
    void mainWindow::slot_numberOpenClose(bool trigger){
        if(trigger){
            dlg->show();
        } else {
        dlg->close();
        }
    }
    

    上面的代码可以使用信号/插槽将数字从对话框的微调器发送到主窗口,但不会锁定主窗口。在对话框被接受或拒绝之前,我不希望用户继续使用主窗口。

    关于如何在对话框关闭时锁定主窗口并将数字发送回主窗口,有什么想法吗?

    2 回复  |  直到 12 年前
        1
  •  7
  •   Jake Petroules    15 年前

    您应该做的是在对话类中创建一个函数,该函数返回您想要的值,并在主窗口中这样使用它:

    void mainWindow::slot_openNumberDlg(){
        // Create a new dialog
        numberDlg dlg( this );
    
        // Show it and wait for Ok or Cancel
        if( dlg.exec() == QDialog::Accepted ){
            m_theValue = dlg.myValue(); // <--
            return;
        }
    } // dlg goes out of scope
    

    除非DLG超出了我放置注释的范围,否则它不会被销毁,因此您的方法可以正常工作。

        2
  •  1
  •   Al2O3    12 年前

    使用 dlg.setWindowModality(qt::WindowModal); :

    void mainWindow::slot_openNumberDlg(){
    
      numberDlg dlg( this );
      dlg.setWindowModality(Qt::WindowModal);//blocks input to its parent window
    
      if( dlg.exec() == QDialog::Accepted )
      {
          dlg.setResult(true);//mask
          return;
      }
      else if(dlg.exec() == QDialog::Rejected)
      {
          dlg.setResult(false);//mask
          return;
      }
    }
    
    
    
      if(dlg.getResult() == true)//value usable only when accepted
      {
          m_theValue = dlg.myValue();
      }
    

    如果您想要更准确的结果,请重写qwidget的closeEvent()方法来处理对话框的退出按钮。(或者您可以将默认值设置为false)

     void numberDlg::closeEvent(QCloseEvent *event)
     {
         setResult(false);
         close();
     }