обновление значения из основного окна в диалоговое

У меня есть главное окно, которое каждую секунду генерирует случайные числа int в «числах», и у меня есть кнопка, которая открывает новый диалог. В этом диалоговом окне есть кнопка «Получить номер» и qlabel. Если я нажму «Получить номер», я хочу, чтобы текущий сгенерированный номер из основного окна был установлен в текст метки диалогового окна. Я попытался написать функцию-член в классе mainwindow, которая возвращает фактическое значение, но я не могу вызвать ее из диалогового окна, и я думаю, что это неправильный путь. Как я могу получить этот текущий сгенерированный int «числа» в диалоговом окне? Мой простой код:

главное окно.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();
    void generateNumbers();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

главное окно.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
#include <QTimer>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QTimer *timer = new QTimer(this);
    connect(timer,SIGNAL(timeout()), this, SLOT(generateNumbers()));
    timer->start(1000);

}

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

void MainWindow::on_pushButton_clicked()
{
    Dialog dialog;
    dialog.setModal(true);
    dialog.exec();
}

void MainWindow::generateNumbers()
{
    int numbers = qrand() % 100;
    qDebug() << numbers;
}

диалог.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H

диалог.cpp

#include "dialog.h"
#include "ui_dialog.h"

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

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

person Paul G.    schedule 17.06.2016    source источник
comment
Используйте для этого сигналы и слоты. В generateNumbers() выдается сингнал numberGenerated(int). Подключите это к слоту в диалоговом окне.   -  person drescherjm    schedule 17.06.2016


Ответы (1)


В mainwindow.h добавьте сигнал:

signals:
    void update_number(int);

В mainwindow.cpp излучайте этот сигнал каждый раз, когда вы создаете новый номер:

void MainWindow::generateNumbers()
{
    int numbers = qrand() % 100;
    emit update_number(numbers); // signals that a new number has been generated
    qDebug() << numbers;
}

и ваш on_pushButton_clicked() должен выглядеть так:

void MainWindow::on_pushButton_clicked()
{
   Dialog dialog(this); // main window as the parent of dialog
   dialog.setModal(true);
   dialog.exec();
}

В dialog.h добавьте атрибут number_ и добавьте следующий слот:

public slots:
    void on_update_number(int number); // updates the number_

private:
    int number_; // it will be updated with the most recent number
    Ui::Dialog *ui;

На dialog.cpp подключите сигнал к слоту:

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    connect(parent, SIGNAL(update_number(int)), this, SLOT(on_update_number(int)));
}

добавьте код слота:

void Dialog::on_update_number(int number)
{
    number_ = number;
}

Наконец, когда пользователь нажимает кнопку «Получить номер» в диалоговом окне, задайте текст метки:

void Dialog::on_pushButton_clicked()
{
    ui->label->setText(QString::number(number_));
}

Для получения дополнительной информации о сигналах и слотах перейдите здесь.

person Serafim Costa    schedule 17.06.2016
comment
Это работает, спасибо. Я не вижу ошибок компилятора, но получаю QMetaObject::connectSlotsByName: Нет соответствующего сигнала для on_update_number(int) на выходе приложения. Я уже пытался излучать и подключаться, но я понятия не имел, где вставить соединение и как поговорить с главным окном, вы показали мне с родителем, спасибо - person Paul G.; 17.06.2016
comment
Я думаю, что нашел ошибку. Я изменил имя на when_update_number(int). Ошибка исчезла. слот с именем on_, за которым следует имя объекта элемента пользовательского интерфейса, за которым следует имя сигнала на этом объекте, будет пытаться подключиться автоматически. Найдено здесь: qtcentre.org/threads/65233-c-Qt5 -Сигналы и слоты - person Paul G.; 17.06.2016