2016-12-14 73 views
1

我是一个在C++中使用Qt Creator的应用程序。 int main()函数如下。 我开始一个QDialog窗口,我正在获取“url”变量内容。如何使用Qt C++在QDialog窗口和QMainWindow之间进行通信

如何将此变量放入mainwindow.cpp文件中。

QApplication a(argc, argv); 
MainWindow *w; //Put it here in case you have several cases where you want to initialize it 

QLoginDialog d; //Your login dialog 
if(d.exec()==QDialog::Accepted) 
{ 
    if(d.isLogged()) //Check the variable used to validate the login 
    { 
     w = new MainWindow; 
     w->show(); 
    } 
    else 
    { 
     //Handle bad login 
     return -1; //Don't forget to return something here 
    } 
} 
else 
{ 
    //Handle dialog not validated 
    return -1; //Don't forget to return something here 
} 

return a.exec(); 

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent): 
     QMainWindow(parent), 
     ui(new Uİ::MainWindow) 
{ 
    QDialog s; 
    s.show(); 
    s.setmodel(true); 

    if(s.exec()==QDialog::Accepted) 
    { 
    if(s.URL=="true") 
    { 
     ui.setupUi(this); 
    } 
    } 
} 

QDialog.cpp = Start.cpp源代码:

#include "start.h" 
#include "ui_start.h" 

Start::Start(QWidget *parent) : 
QDialog(parent), 
ui(new Ui::Start) 
{ 
    ui->setupUi(this); 
} 

Start::~Start() 
{ 
    delete ui; 
} 

void Start::on_pushButton_2_clicked() 
{ 
    QString dirName=QFileDialog::getExistingDirectory(
     this, 
     tr("Select a Directory"), 
     QDir::currentPath()); 

    if(!dirName.isNull()) 
     ui->lineEdit_2->setText(dirName); 
} 

void Start::on_pushButton_3_clicked() 
{ 
    URL=ui->lineEdit->text(); 
    Directory=ui->lineEdit_2->text(); 

    if(URL.isEmpty() && Directory.isEmpty()) 
    { 
     QMessageBox::warning(this,tr("Error"),tr("Please, fill in the blanks")); 
    } 
    else if(URL.isEmpty()) 
    { 
     QMessageBox::warning(this,tr("Error"),tr("is not a valid URL or Path!!")); 
    } 
    else if(Directory.isEmpty()) 
    { 
     QMessageBox::warning(this,tr("Error"),tr("is not a select directory!!")); 
    } 



    ControlConfiguration(); 
} 

void Start::ControlConfiguration() 
{ 
    QString configPosition= ui->lineEdit_2->text(); 

    QString str1="CHECKOUT_HOME"; 
    QString str2="new_checkout.csh"; 
    QString str3="setup_prjsvn.csh"; 

    QMessageBox *msgBox=new QMessageBox(this); 
    int sayac=0; 
    QDir path(configPosition); 

    QStringList files=path.entryList(QDir::Files); 
    for(int i=0; i<files.length(); i++) 
    { 
     if(files[i].compare(str1)==0) 
     { 
      sayac=sayac+1; 
     } 
    } 
    for(int i=0; i<files.length(); i++) 
    { 
     if(files[i].compare(str2)==0) 
     { 
      sayac=sayac+1; 
     } 
    } 
    for(int i=0; i<files.length(); i++) 
    { 
     if(files[i].compare(str3)==0) 
     { 
      sayac=sayac+1; 
     } 
    } 

    if(sayac>=3)//Attention Flurent. if true, open QMainWindow 
    { 
     QMessageBox::information(this,tr(" "),tr("Configuration Directory")); 
     //s_path=ui->lineEdit->text(); 

     this->hide(); 

     s_path="true"; 

     URL=ui->lineEdit_2->text(); 
    } 
    else 
    { 
     msgBox->setInformativeText("Would you like to configure?"); 
     msgBox->setStandardButtons(QMessageBox::Cancel | QMessageBox::No | QMessageBox::Yes); 
     msgBox->setDefaultButton(QMessageBox::Yes); 
     int ret = msgBox->exec(); 
     switch(ret){ 
     case QMessageBox::Yes: 
      Configuration(); 
      break; 
     case QMessageBox::No: 
      //ui->locationEdit->clear(); 
      break; 
     case QMessageBox::Cancel: 
      break; 

     } 

    } 
} 
void Start::Configuration() 
{ 
    QString projePosition= ui->lineEdit_2->text(); // Proje konumu alınır. 
    QProcess* process=new QProcess(this); 
    QMessageBox *msgBox=new QMessageBox(this); 

    process->setWorkingDirectory(projePosition); 

    QString svn_export="svn export  http://atlas/svn/prjsvn/trunk/common/common_bin/istanbul/new_checkout.csh"; 
    QString s_newcheckout="source new_checkout.csh"; 
    QString s_prjsvn="source setup_prjsvn.csh"; 

    process->start("tcsh -c \""+svn_export+";"+s_newcheckout+";"+s_prjsvn+"\""); 

    process->waitForBytesWritten(); 
    process->waitForFi 
} 

回答

2

的标准生成的主文件Qt应用程序包含以下行:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 

    return a.exec(); 
} 

主窗口我在那里创建。

所以在你的情况下,你可以在你返回之前创建主窗口。 通过在构造函数中添加QString作为参数,URL将在主窗口中可用。

所以mainWindow.cpp构造变化:

MainWindow::MainWindow(QString url, QWidget *parent) : 
    QMainWindow(parent), ui(new Uİ::MainWindow) 
{ 
    ui.setupUi(this); 

    //Place your code here that uses the url, 
} 

所以mainWindow.h构造变化:

MainWindow::MainWindow(QString url = "", QWidget *parent = 0); 

和main.cpp中的变化:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QString url; //Fill this from your dialog. 
    MainWindow w(url);//Pass the url to the main window 
    w.show(); 

    return a.exec(); 
} 
+0

更好的做法是执行MainWindow类中的对话框。它有助于保持代码的组织性,因为该值应该在MainWindow中使用。 –

+0

谢谢,我曾经工作源代码@TomConijin –

2

您应该正确看待信号和插槽,以在对象之间传递变量。文档在这里:http://doc.qt.io/qt-4.8/signalsandslots.html

另一种方法是在你的MainWindow中执行QDialog,这将是最好的做法。在他们有用的范围内使用控件。你不应该在主函数中使用对话框。

所以,看看这两种解决方案。对于简单变量来说,最好的方法是在类中使用值来执行对话框,其次是在复杂类之间传递值时使用信号和槽。

的main.cpp

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow *w; //Put it here in case you have several cases where you want to initialize it 

    QLoginDialog d; //Your login dialog 
    if(d.exec()==QDialog::Accepted) 
    { 
     if(d.isLogged()) //Check the variable used to validate the login 
     { 
      w = new MainWindow(d.getUrl()); //I guess the URL comes from your login dialog, so make a function that returns it 
      w->show(); 
     } 
     else 
     { 
      //Handle bad login 
      return -1; //Don't forget to return something here 
     } 
    } 
    else 
    { 
     //Handle dialog not validated 
     return -1; //Don't forget to return something here 
    } 

    return a.exec(); 
} 

mainwindow.cpp

//Don't forget to add the "QString sUrl" to your mainwindow.h 
MainWindow::MainWindow(QString sUrl, QWidget *parent): QMainWindow(parent), ui(new Uİ::MainWindow) 
{ 
    ui.setupUi(this); 

    qDebug()<<s.URL; //It will be displayed here 
} 

你dialog.cpp

//Use this to return the boolean value that represents if the path is valid or not. 
bool QDialog::isLogged() 
{ 
    return this->s_path.equals("true"); 
} 
+0

谢谢,但我想先启动QDialogWindow。因为ıt是登录面板。后来第二次启动QDialogwindow里面的QMainwindow @FlorentUguet –

+0

Qdialog.cpp ----举例:if(count> 3){QMainwindow * p = new QMainWindow(); P->的setAttribute(Qt的:: WA_DeleteOnClose); p-> show} --- @ FlorentUguet –

+0

切勿从对话框中启动窗口小部件或窗口。从对话框中返回一个值,然后处理你想要的。对话框是临时的小部件,不应该是窗口/小部件的父母。 –

0

如果你想要做的就是要求一个输入字符串,我建议你看看QInputDialog

示例:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    bool ok; 
    QString message = QInputDialog::getText 
    (0, "Input","URL:", QLineEdit::Normal,"", &ok); 
    qDebug()<<message; 
    ui->setupUi(this); 
} 
+0

什么是这个boolflag?我想首先启动Qdialogwindow,启动时应用程序@me_alok –

+0

&boolflag是对布尔标志变量的引用,它在编辑中被替换为bool ok。 –

+0

当应用程序启动时,对话框将出现 –

相关问题