2014-11-02 94 views
0

嗨,我是Qt的新手,並開始瞭解插槽和信號。使用插槽和信號連接Qt中的兩個窗體

這是我正在測試的一個小程序。它包含兩種形式(MainWindow)和(form1)。

主窗口有一個按鈕和一個標籤:

  • 如果按鈕被點擊它顯示Form1中,其中有一個按鈕和一個行編輯。
  • 如果點擊此按鈕(form1),它應該採用lineEdit的字符串並將mainwindow的標籤更改爲該字符串。

測試時按預想它不工作,但我不知道爲什麼

MainwWindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include "form1.h" 
namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    form1 *sender; 
    ~MainWindow(); 

private slots: 
    void on_pushButton_clicked(); 
    void changelabel(QString); 

private: 
    Ui::MainWindow *ui; 
}; 

#endif // MAINWINDOW_H 

MainWindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include "form1.h" 
MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    sender = new form1; 
    connect(sender,SIGNAL(entered(QString)),this,SLOT(changelabel(QString))); 
    ui->setupUi(this); 
} 

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

void MainWindow::on_pushButton_clicked() 
{ 
    form1 formno1; 
    formno1.setModal(true); 
    formno1.exec(); 
} 

void MainWindow::changelabel(QString x) 
{ 
    ui->label->setText(x); 
} 

Form1上。 h

#ifndef FORM1_H 
#define FORM1_H 

#include <QDialog> 

namespace Ui { 
class form1; 
} 

class form1 : public QDialog 
{ 
    Q_OBJECT 

public: 
    explicit form1(QWidget *parent = 0); 
    ~form1(); 

private slots: 
    void on_pushButton_clicked(); 

signals: 
    void entered(QString); 

private: 
    Ui::form1 *ui; 
}; 

#endif // FORM1_H 

form1.cpp

#include "form1.h" 
#include "ui_form1.h" 

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

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

void form1::on_pushButton_clicked() 
{ 
    QString name = ui->lineEdit->text(); 
    emit entered(name); 
    this->hide(); 
} 

非常感謝

回答

0

創建窗體的絕對新實例,但您的連接只能與另一個實例(發件人),所以使用發件人或做新實例,新的連接。嘗試下,例如:

void MainWindow::on_pushButton_clicked() 
{ 
    sender->setModal(true); 
    sender->exec();//or show() 
} 

爲了避免在未來的另一個錯誤,我建議你setupUi()

+0

非常感謝後寫在構造函數代碼。我現在明白了 – Ahmed 2014-11-02 13:00:56