Qt. Передача данных между двумя классами

447
13 января 2017, 09:26

Есть два окна. В одном окне LineEdit, в другом - PushButton. Как при нажатии кнопки передать ее надпись в LineEdit? Думал это все дело реализовать через указатель, но не вышло...

Класс первого окна (с LineEdit)

#ifndef WINDOW_H
#define WINDOW_H
#include <QDialog>
#include <QLineEdit>
#include "table.h"
class Table;
class Window : public QDialog
{
    Q_OBJECT
public:
    Window(QWidget *parent = 0);
    ~Window();
    Table *table;
    QLineEdit *edit;
};
#endif // WINDOW_H

Его методы:

#include "window.h"
Window::Window(QWidget *parent): QDialog(parent)
{
    table = new Table;
    table->show();
    edit = new QLineEdit(this);
}
Window::~Window()
{
}

Класс второго окна (с кнопкой):

#ifndef TABLE_H
#define TABLE_H
#include <QDialog>
#include <QPushButton>
#include "window.h"
class Window;
class Table : public QDialog
{
    Q_OBJECT
public:
    Table(QWidget *parent = 0);
    ~Table();
    QPushButton *btn;
    Window *ptr;
private slots:
                void Slot();
};

#endif // TABLE_H

Его методы:

#include "table.h"

Table::Table(QWidget *parent) : QDialog(parent)
{
    btn = new QPushButton(this);
    btn->setText("Ok");
    connect(btn, SIGNAL(clicked(bool)), this, SLOT(Slot()));
}

Table::~Table()
{
}
void Table::Slot()
{
    ptr->edit->setText(btn->text());
}
Answer 1

Можно у первого окна объявить сигнал textChanged(QString). Примерно так:

class FirstWindow : public QWidget{
    Q_OBJECT       
public:
    FirstWindow(QWidget *parent = 0):
        QWidget(parent)
    {
        QPushButton *button = new QPushButton("button"); 
        connect(button, SIGNAL(clicked(bool)), SLOT(_textChanged()));
    }
signals:
    void textChanged(const QString &text) const;
private slots:
    void _textChanged() const{
        QPushButton *button = qobject_cast<QPushButton*>(sender());
        if(!button){
            return;
        }
        emit textChanged(button->text());
    }
};

А у второго окна объявить слот setText(QString), который будет устанавливать текст в lineEdit:

class SecondWindow : public QWidget{
    Q_OBJECT       
    QLineEdit *_lineEdit;
public:
    FirstWindow(QWidget *parent = 0):
        QWidget(parent),
        _lineEdit(new QLineEdit)
    {}
public slots:
    void setText(const QString &text){
        _lineEdit->setText(text);
    }
};

А теперь там, где вы создаете эти окна, соедините эти сигнал и слот:

FirstWindow *firstWindow = new FirstWindow;
SecondWindow *secondWindow = new SecondWindow;
connect(firstWindow, SIGNAL(textChanged(QString)), secondWindow, SLOT(setText(QString)));

В принципе должно работать и так, но реализацию FirstWindow можно сделать немного более красивой если воспользоваться классом QSignalMapper:

class FirstWindow : public QWidget{
    Q_OBJECT       
public:
    FirstWindow(QWidget *parent = 0):
        QWidget(parent)
    {
        QSignalMapper *mapper = new QSignalMapper(this);
        connect(signalMapper, SIGNAL(mapped(QString)), SIGNAL(textChanged(QString)));
        QPushButton *button = new QPushButton("button");
        mapper->setMapping(button, button->text());
        connect(button, SIGNAL(clicked(bool)), mapper, SLOT(map())); 
    }
signals:
    void textChanged(const QString &text) const;
};
READ ALSO
Какие технологии Boost уже были включены в официальную спецификацию C++ 11? [требует правки]

Какие технологии Boost уже были включены в официальную спецификацию C++ 11? [требует правки]

Какие технологии Boost были включены и реализованы в stdlib C++ 11?

262
Вывод дробной части от логарифма C++

Вывод дробной части от логарифма C++

Необходимо определить, является ли логарифм a по основанию b целымМое решение: cout<<fmod(log(a)/log(b),1); Но, например, при тесте a=46656 b=6, программа...

285
Помогите осознать суть сетей

Помогите осознать суть сетей

У меня есть два ноутбукаНа них стоят ubuntu

281
Освоение сетей. Клиент сервер

Освоение сетей. Клиент сервер

Сервер и клиентОтправляю данные, ничего не происходит, дебажу send выдает SIGPIPE? В чем может быть проблема?

284