Нормально ли не иметь возможность повторно использовать переменную, полученную из connect ()? - PullRequest
0 голосов
/ 01 апреля 2020

Я создал страницу входа в систему и пытаюсь получить имя пользователя, который вошел в систему, а затем отобразить его на следующей странице и настроить свою программу в соответствии с человеком, вошедшим в систему.

Но Я отчаянно сталкиваюсь с той же проблемой, я не могу извлечь переменную из слота, чтобы повторно использовать ее и сделать все, что я должен с ней делать :( Поэтому мне интересно, если это специфика слота (я запускаю Qt, и я не я не знаю много об этом) или если я тот, кто не все делает правильно.

PS: Я, очевидно, прочитал и перечитал документацию Qt по этому поводу, но это не слишком помогает.

Мой код:

glybook. cpp (где я хочу разместить информацию для входа)

#include "ui_glybook.h"

glybook::glybook(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::glybook)
{
    ui->setupUi(this);
    //qDebug() << receiveConnectionData(username);
    test();
}

void glybook::receiveConnectionData(QString name){
    username = name;
    //qDebug() << username;
    ui->label->setText("Connected: "+username);
}

void glybook::test(){

    qDebug() << ui->label->text();
}

glybook::~glybook()
{
    delete ui;
}

glybook.h

class Glybook;
}

class Glybook : public QMainWindow
{
    Q_OBJECT

public:
    explicit Glybook(QWidget *parent = nullptr);
    ~Glybook();

    void test();

private slots:
    void receiveConnectionData(QString);

private:
    Ui::Glybook *ui;

    QString username;
};

соединение. cpp (страница входа)

#include "./ui_connection.h"

Connection::Connection(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::Connection)
{
    ui->setupUi(this);
}

Connection::~Connection()
{
delete ui;
}

void Connection::on_pushButton_clicked()
{

QString user =  ui->lineEdit->text();
QString pass = ui->lineEdit_2->text();

glybook* page = new glybook();

connect(this, SIGNAL(sendConnectData(QString)), page, SLOT(receiveConnectionData(QString)));

emit sendConnectData(user);
page->show();
this->close();
}


соединение. ч

#define CONNECTION_H

#include <QMainWindow>
#include <QMessageBox>
#include "glybook.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Connection; }
QT_END_NAMESPACE

class Connection : public QMainWindow
{
    Q_OBJECT

public:
    Connection(QWidget *parent = nullptr);
    ~Connection();

private slots:
    void on_pushButton_clicked();

signals:
    void sendConnectData(QString);

private:
    Ui::Connection *ui;
};
#endif // CONNECTION_H

main. cpp


#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Connection w;
    w.show();
    return a.exec();
}

1 Ответ

1 голос
/ 02 апреля 2020

Причина

Вы вызываете метод test для glybook в его конструкторе, который выполняется в результате этой строки:

glybook* page = new glybook();

В то время ни соединение

connect(this, SIGNAL(sendConnectData(QString)), page, SLOT(receiveConnectionData(QString)));

, и сигнал sendConnectData не излучается, поэтому ваш qDebug() << ui->label->text(); печатает пустой QString.

Решение

Если вы хотите посмотрите значение, отправленное Connection в glybook, проверьте его ПОСЛЕ выполнения слота receiveConnectionData.

При этом я настоятельно рекомендую вам прочитать об объектно-ориентированном программировании, а также go через хорошо известный курс Qt от VoidRealms на Youtube.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...