使用插槽和信号连接Qt中的两个表单

时间:2014-11-02 12:49:34

标签: qt

嗨,我是Qt的新手,开始学习插槽和信号。

这是我正在测试的一个小程序。 它包含两种形式(MainWindow)和(form1)。

MainWindow有一个按钮和一个标签:

  • 如果单击该按钮,则会显示form1,其中包含一个按钮和一行编辑。
  • 如果单击此按钮(form1),则应该使用lineEdit的字符串,并将主窗口的标签更改为该字符串。

测试时,它不能按预期工作,但我不知道为什么

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

非常感谢

1 个答案:

答案 0 :(得分:0)

您创建表单的绝对新实例,但您的连接仅适用于另一个实例(发件人),因此请使用发件人或与新实例建立新连接。例如,尝试下一步:

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

为了避免将来出现其他错误,我建议您在setupUi()

之后在构造函数中编写代码