Есть два окна. В одном окне 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());
}
Можно у первого окна объявить сигнал 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;
};
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие технологии Boost были включены и реализованы в stdlib C++ 11?
Необходимо определить, является ли логарифм a по основанию b целымМое решение: cout<<fmod(log(a)/log(b),1); Но, например, при тесте a=46656 b=6, программа...
Сервер и клиентОтправляю данные, ничего не происходит, дебажу send выдает SIGPIPE? В чем может быть проблема?