1

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

第一个窗口.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

第二个窗口.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

主文件

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

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

    return a.exec();
}

第一个窗口.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);

    }
}

第二个窗口.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();
}
4

2 回答 2

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 成员变量的时间和地点。

于 2013-10-16T16:03:46.640 回答
1

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

这是一个完整的示例,说明了我的意思。主.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。

于 2013-10-19T08:23:47.203 回答