2017-09-16 4 views
1

버튼 클릭시 한 폼 (MainWindow)에서 다른 폼 (Dialog)으로 데이터를 보내기위한 작은 프로그램을 작성했습니다. 버튼을 클릭하면 MainWindow의 lineEdit에 쓰여진 값이 Dialog 폼의 레이블에 표시됩니다!신호 및 슬롯 잘못된 값 전송 (Qt C++)

버튼을 클릭하면 라벨에 값이 표시되지만 라인 편집에 입력 한 값과 다릅니다. 다음은 2 헤더 및 2 cpp 파일의 해당 코드입니다.

MainWindow.h

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

    signals: 
    void sendIntData(int data); 
    public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
} 

MainWIndow.cpp

void MainWindow::on_pushButton_clicked() 
{ 
    Dialog *dialog1=new Dialog(this); 

    dialog1->setModal(true); 
    dialog1->exec(); 

    int o=ui->lineEdit->text().toInt(); 


    connect(this, SIGNAL(sendIntData(int)),dialog1, SLOT(setIntData(int))); 


    emit sendIntData(o); 

} 

Dialog.h

class Dialog : public QDialog 
{ 
    Q_OBJECT 

    public slots: 
    void setIntData(int data); 

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

Dialog.cpp

Dialog::Dialog(QWidget *parent) : 
QDialog(parent), 
ui(new Ui::DIalog) 
{ 
    ui->setupUi(this); 
    QString value=QString::number(index); 
    ui->label->setText(value); 
} 

Dialog::~Dialog() 
{ 
    delete ui; 
} 
void Dialog::setIntData(int data) 
{ 
    index=data; 
} 
,

예 - 3을 클릭하고 버튼을 누르면 값이 7237481! 이 문제를 어떻게 해결할 수 있습니까?

+0

에서 방출? '신호를 보내기 전에 connect (this, SIGNAL (sendIntData (int)), dialog1, SLOT (setIntData (int)));를 넣는다. – aghilpro

+0

@aghilpro 고맙습니다.하지만 저는 여전히 잘못된 가치를 가지고 있습니다. : –

+0

방출하기 전에이'qDebug() << o;'줄을 넣고 값을 봅니다 LineEdit에서 쓰는 값은 무엇입니까? – aghilpro

답변

0

초기화하지 않은 int 값을 표시한다고 생각합니다.

int o=ui->lineEdit->text().toInt(); 
connect(this, SIGNAL(sendIntData(int)),dialog1, SLOT(setIntData(int))); 
emit sendIntData(o); 

표시 값 :

신호를 방출

void Dialog::setIntData(int data) 
{ 
    ui->label->setText(QString::number(data)); 
} 
+0

@ Kushan Peiris 도움이 될 것입니다. – aghilpro

+0

이 답변은 올바르게 판단 할 수 없습니다. 왜냐하면 변수 'data'는 절대로 송신 코드가 바뀌지 않았기 때문입니다. – Taz742

+0

질문 주석을 읽으십시오. 감사합니다 – aghilpro

1

우리가 우리의 대화를 전달하기 만하면, 신호와 슬롯의 중요성이 필요하지 않은 경우. 이 값을 생성자에 제공하거나 초기화 함수를 사용하여 값을 제공 할 수 있습니다.

//way 1: 
void MainWindow::on_pushButton_clicked(){ 
    Dialog *dlg = new Dialog(); 
    connect(this, SIGNAL(SendData(int)), dlg, SLOT(slotData(int))); 
    emit SendData(ui->lineEdit->text().toInt()); 
    dlg->exec(); 
} 

void Dialog::slotData(int arg1) 
{ 
    ui->label->setText(QString::number(arg1)); 
} 

//way 2: 
void MainWindow::on_pushButton_clicked(){ 
    Dialog* dlg = new Dialog(ui->lineEdit->text().toInt()); 
    dlg->exec(); 
} 

//way 3: 
#include "dialog.h" 
#include "ui_dialog.h" 
#include "QDebug" 

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

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

void Dialog::initialize(int value) 
{ 
    ui->label->setText(QString::number(value)); 
} 


void MainWindow::on_pushButton_clicked(){ 
    Dialog *dlg = new Dialog(); 
    dlg->initialize(ui->lineEdit->text().toInt()); 
    dlg->exec(); 
} 
+1

설명없이 답변을 게시하지 마십시오. –

+0

대화 상자는 MainWindow :: MainWindow에 한 번 할당 된 다음 show() 및 hide()를 사용해야합니다. 현재 MainWindow의 부모가 아닌 각 클릭에 메모리를 할당하고 있습니다. – user3606329

2

연결 교체하고 왜 연결이`emit` 신호 후 작성하여 on_pushButton_clicked()

void MainWindow::on_pushButton_clicked() 
{ 
    Dialog *dialog1=new Dialog(this); 

    dialog1->setModal(true); 
    dialog1->exec(); 

    int o=ui->lineEdit->text().toInt(); 

    connect(this, SIGNAL(sendIntData(int)),dialog1, SLOT(setIntData(int))); 

    emit sendIntData(o); 
}