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

时间:2014-03-18 00:17:00

标签: c++ qt qt5

我正在尝试编写一个非常基本的程序。主窗口包含一个标签。按“添加新”按钮打开带有QLineEdit的QDialog。更改文本,按“添加”,我希望主窗口中的QLabel使用QLineEdit中的文本进行更新。我可以通过信号,但标签没有更新。我知道connect只适用于类的实例,而不适用于类本身。问题似乎是一个类不知道主窗口的实例。

我尝试做的是按下“添加”按钮后,会发出信号。一旦发出该信号,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();

}

1 个答案:

答案 0 :(得分:2)

一种解决方案是将连接代码放在mainWindow :: mainWindow中,您可以在其中指向主窗口和新创建的对话框。该代码段可能会更改为:

mainWindow::mainWindow() : QWidget(0) {

// ... existing code ..

// add this
connect(dialog, SIGNAL(textChanged(QString)),
        this,  SLOT(recvText(QString)));
}