E
E
Egorithm2017-01-31 12:49:22
Qt
Egorithm, 2017-01-31 12:49:22

Qt. How to use signals-slots?

In general, I can not understand how to do it. It would be nice if you showed on this example how to implement.
I decided to make a mass converter from Russian folk to Sishnye.
Here is what I coded:

#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication MyApp(argc,argv);

    // Меры масс
    QStringList ListWeight1, ListWeight2;

    // Ввод
    ListWeight1 << "БЕРКОВЕЦ"  << "ПУД"
                << "ФУНТ"      << "ЛОТ"
                << "ЗОЛОТНИК"  << "ДОЛЯ";

    // Вывод
    ListWeight2 << "ГРАММ"     << "КИЛОГРАММ"
                << "МИЛИГРАММ" << "ТОННА";

    // создать объект для хранения шрифта
    QFont Font[2];              // два шрифта
    Font[0].setPointSize(12);   // для заголовка
    Font[1].setPointSize(10);   // для текста

    // Базовый объект (окно)
    QWidget Base;                           // создать базовый объект
    Base.setWindowFlags(
               Qt::WindowCloseButtonHint);
    Base.setWindowTitle("Конвертер Масс");
    Base.setFixedSize(400,250);             // задать фиксированные ширину и высоту
    Base.show();                            // отобразить базовый объект

    // Заголовок
    QLabel Title(&Base);                    // создать объект-метку
    Title.resize(200,50);                   // задать размер объекта
    Title.move(100,0);                      // задать расположение объекта
    Title.setAlignment(Qt::AlignCenter);    // выровнивить содержиме по центру
    Title.setText("КОНВЕРТЕР МАСС");        // задать отображаемый текст         
    Title.setFont(Font[0]);                 // установить настройки текста для объекта
    Title.show();                           // отобразить объект-метку

    // Поле для значения веса (ввод)
    QLineEdit Input(&Base);
    Input.resize(150,30);
    Input.move(25,70);
    Input.setFont(Font[1]);
    Input.show();

    // Выпадающий список с единицами веса (ввод)
    QComboBox UnitInput(&Base);
    UnitInput.resize(150,30);
    UnitInput.move(225,70);
    UnitInput.setFont(Font[1]);
    UnitInput.addItems(ListWeight1);
    UnitInput.show();

    // Поле для значения веса (вывод)
    QLineEdit Output(&Base);
    Output.resize(150,30);
    Output.move(25,140);
    Output.setReadOnly(true);   // запрет редактирования
    Output.show();

    // Выпадающий список с единицами веса (вывод)
    QComboBox UnitOutput(&Base);
    UnitOutput.resize(150,30);
    UnitOutput.move(225,140);
    UnitOutput.setFont(Font[1]);
    UnitOutput.addItems(ListWeight2);
    UnitOutput.show();

    // Кнопка для вычисления
    QPushButton Button(&Base);
    Button.resize(100,30);
    Button.move(150,200);
    Button.setText("ВЫЧИСЛИТЬ");
    Button.setFont(Font[1]);
    Button.show();

    return MyApp.exec();
}

Here's what happened:
e885ad1b750c4cf784fdc1182a8725cf.png
Now you need to write the algorithm itself. But how to implement signal slots? I realized that through connect, but how it does not reach.
Make an infinite loop? As I understand it, when you press the "CALCULATE" button, you need to send a signal to 3 slots: to 2 ComboBoxes and to the edited LineEdit. Then I will get a line from LineEdit, convert it to a number, and then calculate it with if-else-ifs and display it in the second LineEdit after converting it to a string.

Answer the question

In order to leave comments, you need to log in

3 answer(s)
M
Mercury13, 2017-01-31
@EgoRusMarch

No, we start a new slot somewhere and send a signal to it.
There are two ways to create a new slot: either inherit from QObject or its descendant (it's convenient to inherit the main form), or use the C++11 lambda function. Since all of our forms are on the stack, it's easiest to write a lambda.

connect(&Button, &QPushButton::clicked, 
            &Base, [&]() {
        // тут код
    });

In real projects, each form inherits from QWidget (or something similar) and stores its own components. And slots are functions in a form.

J
Jacob E, 2017-01-31
@Zifix

What, did you get a version of the tutorial without signal and slot examples at all? Maybe at least create a class, there are no signals and slots in main.cpp .
MyApp.exec(); - and there is an infinite loop

D
devalone, 2017-01-31
@devalone

Make a separate class for the window. Those. something like this:
main.cpp :

#include "mainwindow.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.h :
#ifndef MAINWINDOW_H
#define MAINWINDOW_H


#include <QtWidgets/QMainWindow>
#include <QtWidgets/QPushButton>


class MainWindow : public QMainWindow
{
    Q_OBJECT

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

public slots:
    void buttonPressed();
private:
    void setupUi();
    QPushButton *pushButton;
};

#endif // MAINWINDOW_H

mainwindow.cpp :
#include "mainwindow.h"

#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    setupUi();
}

MainWindow::~MainWindow()
{

}

void MainWindow::buttonPressed()
{
    QMessageBox::warning(this, "Hello", "Hello, World");

}

void MainWindow::setupUi()
{
    if (objectName().isEmpty())
        setObjectName(QStringLiteral("MainWindow"));

    resize(400, 300);
    setCentralWidget(new QWidget(this));

    pushButton = new QPushButton(centralWidget());
    pushButton->setObjectName(QStringLiteral("pushButton"));
    pushButton->setGeometry(QRect(90, 90, 92, 27));

    connect(pushButton, SIGNAL(clicked(bool)), this, SLOT(buttonPressed()));

}

*.pro :
QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TEMPLATE = app
TARGET = untitled27
INCLUDEPATH += .

HEADERS += mainwindow.h
SOURCES += main.cpp mainwindow.cpp

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question