如何与qt c 之间在qdialog窗口和qmainwindow之间进行通信



i是使用C 中QT创建者的应用程序。int main()函数如下。我正在启动一个QDialog窗口,其中我正在获取" URL"可变内容。

如何将此变量获取到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
}

您应该正确查看信号和插槽,以在对象之间传递变量。文档在这里: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");
}

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

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

主窗口是在那里创建的。

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

所以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();
}

如果您要做的就是要求输入字符串,我建议您看看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);
}

相关内容

  • 没有找到相关文章

最新更新