2017-09-16 56 views
1

我已经写了一个小程序时按钮点击从一种形式(主窗口)将数据发送到另一个(对话框)。单击按钮时,写在MainWindow的lineEdit中的值将以对话框形式显示在标签上!信号和(++ 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

为什么你的连接是'emit'信号后,发出写?把'connect(这个,SIGNAL(sendIntData(int)),dialog1,SLOT(setIntData(int)));'发出信号之前。 – aghilpro

+0

@aghilpro Thanx我改变了,但我仍然得到错误的价值! :( –

+0

把这个'qDebug()<< O; EMIT前'行,看到的价值是什么,你在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

更换连接和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); 
}