Qt信号槽无法正常工作

时间:2013-10-16 15:53:54

标签: c++ qt qtcore qt-signals

我想要从第二个窗口更新第一个窗口中的标签中的文本,其中是行编辑以写入一些文本。这个文字应该在第一个窗口中显示出来。 我花了一个星期的时间。 着名的连接不起作用。 有人纠正下面的代码并解释连接应该如何工作? 我在版本 5.1.1

中使用Qt

firstwindow.h

#ifndef FIRSTWINDOW_H
#define FIRSTWINDOW_H

#include <QMainWindow>
#include "secondwindow.h"

namespace Ui {
class Firstwindow;
}

class Firstwindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit Firstwindow(QWidget *parent = 0);
    ~Firstwindow();
public slots:
    void addEntry();
private slots:
    void on_pushButton_clicked();

private:
    Ui::Firstwindow *ui;
    Secondwindow *asecondwindow;
    Secondwindow *absecondwindow;
    Secondwindow *abcsecondwindow;
};

#endif // FIRSTWINDOW_H

secondwindow.h

#ifndef SECONDWINDOW_H
#define SECONDWINDOW_H

#include <QDialog>
#include <QtWidgets>

namespace Ui {
class Secondwindow;
}

class Secondwindow : public QDialog
{
    Q_OBJECT

public:
    explicit Secondwindow(QWidget *parent = 0);
    ~Secondwindow();
QLineEdit *lineEdit;

private slots:
    void on_pushButton_clicked();

private:
    Ui::Secondwindow *ui;
    QPushButton *pushButton;
};

#endif // SECONDWINDOW_H

的main.cpp

#include "firstwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Firstwindow w;
    w.show();

    return a.exec();
}

firstwindow.cpp

#include "firstwindow.h"
#include "ui_firstwindow.h"
#include <QtCore>
#include <QtGui>
#include <QtWidgets>

Firstwindow::Firstwindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Firstwindow)
{
    ui->setupUi(this);
    asecondwindow = new Secondwindow();
    QObject::connect(asecondwindow->lineEdit,SIGNAL(textChanged()),this, SLOT(addEntry()));
}

Firstwindow::~Firstwindow()
{
    delete ui;
    delete asecondwindow;
    delete absecondwindow;
    delete abcsecondwindow;
}

void Firstwindow::on_pushButton_clicked()
{
    absecondwindow = new Secondwindow;
    absecondwindow->exec();

}

void Firstwindow::addEntry()
{
    abcsecondwindow = new Secondwindow;

    if (abcsecondwindow->exec()) {
        QString name = abcsecondwindow->lineEdit->text();
        ui->label->setText(name);

    }
}

secondwindow.cpp

#include "secondwindow.h"
#include "ui_secondwindow.h"
#include <QDialog>

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

Secondwindow::~Secondwindow()
{
    delete ui;
}
void Secondwindow::on_pushButton_clicked()
{
  //  emit ui->lineEdit->textChanged();
    QDialog::accept();
}

2 个答案:

答案 0 :(得分:3)

我看到以下问题:

  • QLineEdit没有信号textChanged()。它应该是textChanged(const QString &)。所以你必须安装你的连接,如:

    QObject::connect(asecondwindow->lineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(addEntry(const QString &)));
    

    请注意,我将Firstwindow::addEntry()广告位更改为Firstwindow::addEntry(const QString &)以匹配信号的签名。

  • 我找不到创建Secondwindow类的QLineEdit成员变量的时间和位置。

答案 1 :(得分:1)

您正在做的事情存在一个基本的设计问题。无需将第二个窗口的内部属性暴露给第一个窗口。只需在第二个窗口内监听更改,并在其发生变化时发出信号。然后第一个窗口可以只听第二个窗口的更改。

这是一个显示我的意思的完整示例。的的main.cpp

#include <QApplication>
#include <QDialog>
#include <QLabel>
#include <QMainWindow>
#include <QPushButton>
#include <QLineEdit>
#include <QVBoxLayout>

class SecondWindow : public QDialog {
    Q_OBJECT
public:
    SecondWindow(QMainWindow *parent = 0) : QDialog(parent) {
        QLineEdit *edit = new QLineEdit;
        QPushButton *close = new QPushButton(QStringLiteral("close"));
        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(edit);
        layout->addWidget(close);

        setLayout(layout);

        connect(edit, SIGNAL(textChanged(QString)), this, SIGNAL(textChanged(QString)));
        connect(close, SIGNAL(clicked()), this, SLOT(close()));
    }

signals:
    void textChanged(const QString &text);
};

class FirstWindow : public QMainWindow {
    Q_OBJECT
public:
    FirstWindow(QMainWindow *parent = 0) : QMainWindow(parent) {
        QWidget *central = new QWidget(this);

        QPushButton *button = new QPushButton(QStringLiteral("Open"));
        label = new QLabel(QStringLiteral("Output appears here"));

        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(button);
        layout->addWidget(label);
        central->setLayout(layout);

        setCentralWidget(central);

        connect(button, SIGNAL(clicked()), this, SLOT(createWindow()));
    }

private slots:
    void createWindow() {
        SecondWindow *window = new SecondWindow(this);
        connect(window, SIGNAL(textChanged(QString)), this, SLOT(setLabelText(QString)));
        window->resize(300, 300);
        window->exec();
    }

    void setLabelText(const QString &text) {
        label->setText(text);
    }

private:
    QLabel *label;
};



int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    FirstWindow w;
    w.resize(400, 400);
    w.show();

    return a.exec();
}

#include "main.moc"

不是说SecondWindow在QLineEdit上侦听更改并在该值发生更改时发出其自己的信号。然后,FirstWindow只是连接到该信号,并在收到信号时更改自己的QLabel。