Qt信号槽不工作

Qt signal-slot not working

本文关键字:工作 信号 Qt      更新时间:2023-10-16

我想从第二个窗口更新第一个窗口中标签中的文本,其中行编辑以写入一些文本。此文本应显示在第一个窗口中。我花了一个星期的时间。著名的连接不起作用。是否有人纠正以下代码并解释连接应该如何工作?我在 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

主.cpp

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

我看到以下问题:

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

你正在做的事情有一个基本的设计问题。无需向第一个窗口公开第二个窗口的内部属性。只需在第二个窗口中侦听变化,并在它发生变化时发出信号。然后第一个窗口可以只侦听第二个窗口上的更改。

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