QT:简单的文本从QLineEdit到QLabel的不同类

QT: simple text from QLineEdit to QLabel of different class

本文关键字:QLabel 同类 QLineEdit 简单 文本 QT      更新时间:2023-10-16

我想写一个非常基本的程序。主窗口包含一个标签。按"添加新"按钮打开一个QLineEdit对话框。更改文本,按"添加",我希望主窗口中的QLabel与QLineEdit的文本更新。我可以接收到信号,但是标签没有更新。我知道connect只适用于类的实例,而不是类本身。问题似乎是一个类不知道主窗口的实例。

我想做的是,一旦Add按钮被按下,就会发出一个信号。一旦这个信号被发出,mainWindow类中的槽接收到一个在QLabel::setText()中使用的字符串。

我读过无数的例子和文档,但这些例子似乎与我迷失的简单任务太不一样了。如有任何帮助,不胜感激。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtWidgets>
#include <QLabel>
class QLineEdit;
class QPushButton;
class QLabel;
class addDlg : public QDialog{
Q_OBJECT
public:
addDlg(QWidget *parent = 0);
signals:
void textChanged(const QString &text);
private slots:
void sendText(QWidget *parent);
private:
QPushButton *addButton;
QLineEdit   *inputText;
};
class mainWindow : public QWidget{
Q_OBJECT
public:
mainWindow();
QLabel      *textLabel;
public slots:
void recvText(const QString &text);
private slots:
void addDlgShow();
private:
QPushButton *addWindow;
addDlg      *dialog;
};
#endif // MAINWINDOW_H

MainWindow.cpp

addDlg::addDlg(QWidget *parent)
: QDialog(parent){
inputText = new QLineEdit(tr("enter here"));
addButton = new QPushButton(tr("Accept"));
QVBoxLayout *vLayout = new QVBoxLayout;
vLayout->addWidget(inputText);
vLayout->addWidget(addButton);
setLayout(vLayout);
setWindowTitle(tr("Add new text"));
connect(addButton, SIGNAL(clicked()),
        this,      SLOT(sendText()));
}
void addDlg::sendText(){
QString text = inputText->text();
emit textChanged(text);
// This connect is where I believe the problem lies.
connect(this, SIGNAL(textChanged(QString)),
        mainPtr,  SLOT(recvText(QString)));
//mainPtr is uninitialized as I can't seem to point it to the manWindow instance
//I can do mainWindow* mainPtr = new mainWindow but that just creates a new instance.
//How do I pass on the first mainWindow main instance "mainPtr" to this class addDlg?
}
mainWindow::mainWindow()
: QWidget(0){
    textLabel = new QLabel(tr("Empty"));
    addWindow = new QPushButton(tr("Add New"));
    dialog    = new addDlg();
    QVBoxLayout *vLayout = new QVBoxLayout;
    vLayout->addWidget(textLabel);
    vLayout->addWidget(addWindow);
    setLayout(vLayout);
    setWindowTitle(tr("Test 4"));
    connect(addWindow, SIGNAL(clicked()),
            this,      SLOT(addDlgShow()));
}
void mainWindow::addDlgShow(){  dialog->show(); }

void mainWindow::recvText(const QString &text){
    QString input = text;
    textLabel->clear();
    textLabel->setText(input);
    textLabel->update();
}

一个解决方案是把你的连接代码放在mainWindow::mainWindow中,在那里你有指向主窗口和你新创建的对话框的指针。代码片段可能会变成这样:

mainWindow::mainWindow() : QWidget(0) {
// ... existing code ..
// add this
connect(dialog, SIGNAL(textChanged(QString)),
        this,  SLOT(recvText(QString)));
}