Cигналы в QT между несколькими окнами

104
02 марта 2022, 13:00

Не бросайтесь сразу камнями. Читал и форумы, и документацию и уже неделю тыкаюсь, но все стою на месте. Один раз видел пример, как человек создал кнопку, при нажитии которой открывалось окно, он вписывал текст, закрывал его, отрывал другое окно и там был этот текст. Не могу найти эту статью.

Как работать с сигналами в Qt?

Есть главное окно (MainWindow). В главном онке есть

public slots: 
void slot_name(QString str);

Я создал еще один клас (Class_2), обьявил его в файле h по указателю, в конструкторе главного окна

temp = new Class_2;

Во втором класе, через графический редактор, впендюрил QLineEdit. Создал сигнал

signals:
void login(QString &str);

Так же создал создал через графический редактор слот

public slots:
void login_slot_textChanged(const QString &arg1);

В итоге что я хочу и что я получаю. В главном окне есть кнопка, при нажатие на которую открывается второе окно через

temp->show();

В котором я ввожу имя и хочу что бы это имя сохранилось в переменной QString из первого окна. По инструкции это можно сделать используя connect. По мануалу и форумам делается так

connecnt(ОБЬЕКТ_ИЗДАВАЕМЫЙ_СИГНАЛ, УКАЗЫВАЕМ_ЧТО_ЭТО_СИГНАЛ(ИМЯ_СИГНАЛА), ОБЬЕКТ_ПОЛУЧАЮЩИЙ_СИГНАЛ, УКАЗЫВАЕМ_ЧТО_СИГНАЛ_ПОЛУЧАЕТ_СЛОТ(ИМЯ_СЛОТА));

и у меня получается

connect(tmp, SIGNAL(login(QString &str)), this, SLOT(slot_name(QString str)));

Но ничего не происходит. Как работать с сингалами в одном окне, я разобрался, а вот как с ними работать используя несколько обьектов, не могу догать.

Только прошу вас, не посылайте опять меня на Документация QT

Answer 1

Я извиняюсь, что немного не следовал вашему коду, но мне немного сложно уловить в нем суть.

Создаем в другом классе сигнал, который будет означать, что текст в QLineEdit изменился

connect(ui->lineEdit, &QLineEdit::textChanged, SECOND_CLASS, &SECOND_CLASS_NAME::textIsChanged);

Когда текст в ui->lineEdit изменится будет вызван сигнал textIsChanged.

В первом классе надо написать слот, который будет обрабатывать сигнал из второго класса textIsChanged.
Создаем приватный слот в первом классе:

private slots:
    void textIsChangedSlot(QString text)

И в cpp файле напишем его:

void FIRST_CLASS::textIsChangedSlot(QString text)
{
    qDebug() << text;
}

Он просто будет выводить один свой аргумент text в консоль. Не забываем добавить connect в первом классе для сигнала из второго класса и слота первого:

connect(SECOND_CLASS, &SECOND_CLASS_NAME::textIsChanged, this, &FIRST_CLASS_NAME::textIsChangedSlot);
Answer 2

На вскидку не очень понравилось как вы tmp создаете (непонятно как оно компилируется вообще)

tmp = new Class_2();
connect(tmp, SIGNAL(send_name(QString str)), this, SLOT(name(QString str)));

По connect ваша запись правильная. В остальном посмотрите вывод отладчика. При некорректных коннектах в отладке должен ругаться

Answer 3

Можно передать значение переменной из одного окна в другое с помощью конструктора. допустим у тебя 2 окна onewindow(отсюда берем) и twowindow(сюда передаем). У окна twowindow укажи параметры, скопируй их в переменные, и потом спокойно их используй. пример:

class twowindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit twowindow(QString path , QString projectname, QWidget *parent = nullptr);//принимаемые параметры
private:
Ui::CodeEditor ui;
private:
    QString Path;
    QString Projectname;
private slots:
    void OpenSelectedFolder_DoubleClick();
    void GoBack_clicked();
};
в другом окне вызываешь этот класс для открытия окна
void click_button(это метод в onewindow)
{
  twowindow *window=new twowindow("1", "lol");//передаем параметры
}
READ ALSO
Как распилить монолит на микросервисы?

Как распилить монолит на микросервисы?

На собеседовании по С++ спросили, как можно организовать распил монолита на микросервисыБольше никаких комментариев к вопросу не дали

106
Размер типа с виртуальным базовым классом

Размер типа с виртуальным базовым классом

Пусть у нас есть такое наследование:

76
Поиск простых чисел в матрице [дубликат]

Поиск простых чисел в матрице [дубликат]

Начал изучение C++Нашел такую задачу: поиск простых чисел в матрице

90
Многомерное нормальное распределение

Многомерное нормальное распределение

В стандартной библиотеке есть инструменты для генерации значений из одномерного нормального распределения (std::normal_distribution)Есть ли подобное...

71