0
votes

I'm trying to write a very basic program. The main window contains a label. Pressing the "Add New" button opens a QDialog with a QLineEdit. Changing the text, press "Add" and I would like the QLabel in the main window to be updated with the text from QLineEdit. I can get the signals through but the label is not updating. I understand that connect only works on instances of classes, not classes themselves. The problem seems to be the one class is not aware of the instance of the main window.

What I've tried to do is once the Add button is pressed, a signal is emitted. Once that signal is emitted, the slot in the mainWindow class receives a string to use in QLabel::setText().

I've read countless examples and documentation but the examples seem to be too different from the simple task I'm lost in. Any help is appreciated.

#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

1 Answers

2
votes

One solution is to put your connect code in mainWindow::mainWindow where you have pointers to both the mainwindow and your newly created dialog. The snippet might change to this:

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

// ... existing code ..

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