R
Rus6lan13 травня 2017 р. 15:21

SIGNAL SLOT

У меня есть класс MainWindow. Я делаю класс типа Dialog. Создаю экземпляр этого класс в .h MainWindow. И по нажатии кнопки в MainWindow делаю dialog->show(). Вопрос, как соединить кнопку в dialog со слотом в MainWindow?

#ifndef CREATEDIALOG_H
#define CREATEDIALOG_H

#include <QDialog>
#include <QtWidgets>
#include <QLayout>

namespace Ui {
class createDialog;
}

class createDialog : public QDialog
{
    Q_OBJECT

public:
    explicit createDialog(QWidget *parent = 0);
    QPushButton *acceptbutton;
    QLineEdit *firstName;
    QLineEdit *lastName;
    QLineEdit *patronymic;
    QCheckBox *scholarship;
    QDateEdit *birthdate;
    ~createDialog();

private:
    Ui::createDialog *ui;
};

#endif // CREATEDIALOG_H
dialog = new createDialog;
    connect(dialog->acceptbutton, SIGNAL(clicked(bool)), this, SLOT(insertToSqlModel()));
    dialog->show();

Screenshot_1.png
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

9
Evgenii Legotckoi
  • 14 травня 2017 р. 01:26
  • Відповідь була позначена як рішення.

Вообще немного не понятно в коде. У вас все кнопки созданы в ui файле через дизайнер? Тогда зачем объявлять указатели в public секции на все эти элементы? ui-элементы должны быть скрыты, не стоит вытягивать указатели на них в public секцию.

Что касается сигналов и слотов, то я бы сделал слот клика по кнопке accept, в котором бы испускал специальный сигнал.

Заголовочный файл
#ifndef CREATEDIALOG_H
#define CREATEDIALOG_H

#include <QDialog>

namespace Ui {
class CreateDialog;
}

class CreateDialog : public QDialog
{
    Q_OBJECT

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

signals:
    void insertToSqlModel();

private slots:
    void on_pushButton_clicked();

private:
    Ui::CreateDialog *ui;
};

#endif // CREATEDIALOG_H
Файл реализации
#include "createdialog.h"
#include "ui_createdialog.h"

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

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

void CreateDialog::on_pushButton_clicked()
{
    emit insertToSqlModel();
}

В MainWindow тогда это подключение может выглядеть следующим образом:

void MainWindow::on_pushButton_clicked()
{
    CreateDialog createDialog;
    connect(&createDialog, &CreateDialog::insertToSqlModel,  this, &MainWindow::insertToSqlModel );
    createDialog.exec();
}

P/S/ Старайтесь называть классы с большой буквы, чтобы не было путаницы в коде между названиями классов и именами переменных.

    R
    • 14 травня 2017 р. 02:29

    Ui написал руками в конструкторе Dialog. Кстати, как лучше делать интерфейсы? Самому писать или через дизайнер? Я правильно понимаю, что мы по нажатию на вызываем сигнал insertToSqlModel(), который соединяем в MainWindow с функцией insertToSqlModel().

      Evgenii Legotckoi
      • 14 травня 2017 р. 02:33
      1. Я предпочитаю делать Ui через дизайнер, иначе получается слишком много кода, который только отвлекает при разработке. Да и при наличии опыта работы с ui-дизайнером скорость разработки увеличивается.
      2. Да, правильно понимаете.
        R
        • 16 травня 2017 р. 08:27

        Спасибо.У меня впринципе все работает, но вот такая штука в дебаге

        QMetaObject::connectSlotsByName: No matching signal for on_push_acceptbutton_clicked()
          Evgenii Legotckoi
          • 16 травня 2017 р. 10:12
          on_pushButton_clicked() ручками писали или через дизайнер делали? Если ручками, то с этим слотом не ассоциированного сигнала, ассоциированный сигнал добавляется, когда подобный слот добавляется в код из графического дизайнера.
            R
            • 16 травня 2017 р. 15:34

            да сам ручками, а это как-то влияет?

              R
              • 16 травня 2017 р. 15:35

              И к первому ваше посту здесь, как-то можно поменять название созданного уже класса? централизованно. с createDialog на CreateDialog.

                Evgenii Legotckoi
                • 17 травня 2017 р. 00:06

                Вообще влияет, в ui файле отражаются изменения. А вы вручную прописали этот слот так, будто он был через дизайнер сделан, вот Qt и пытается найти к нему сигнал, если переписать, например, так pushButtonClicked(), то не должна выпадать эта ошибка. Но нужно будет и подключение сигнала не забыть к этому методу.

                  Evgenii Legotckoi
                  • 17 травня 2017 р. 00:08

                  Кликнуть по createDialog правой кнопкой мыши, выбрать рефакторинг, переименовать. Тогда практически везде переименуется. Останется только в ui файле подкорректировать, открывать ui файл в режиме текстового редактора, тогда получится его редактировать из IDE

                    Коментарі

                    Only authorized users can post comments.
                    Please, Log in or Sign up
                    AD

                    C++ - Тест 004. Указатели, Массивы и Циклы

                    • Результат:50бали,
                    • Рейтинг балів-4
                    m
                    • molni99
                    • 26 жовтня 2024 р. 01:37

                    C++ - Тест 004. Указатели, Массивы и Циклы

                    • Результат:80бали,
                    • Рейтинг балів4
                    m
                    • molni99
                    • 26 жовтня 2024 р. 01:29

                    C++ - Тест 004. Указатели, Массивы и Циклы

                    • Результат:20бали,
                    • Рейтинг балів-10
                    Останні коментарі
                    ИМ
                    Игорь Максимов22 листопада 2024 р. 11:51
                    Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                    Evgenii Legotckoi
                    Evgenii Legotckoi31 жовтня 2024 р. 14:37
                    Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                    A
                    ALO1ZE19 жовтня 2024 р. 08:19
                    Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                    ИМ
                    Игорь Максимов05 жовтня 2024 р. 07:51
                    Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                    d
                    dblas505 липня 2024 р. 11:02
                    QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                    Тепер обговоріть на форумі
                    Evgenii Legotckoi
                    Evgenii Legotckoi24 червня 2024 р. 15:11
                    добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                    t
                    tonypeachey115 листопада 2024 р. 06:04
                    google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                    NSProject
                    NSProject04 червня 2022 р. 03:49
                    Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                    9
                    9Anonim25 жовтня 2024 р. 09:10
                    Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                    Слідкуйте за нами в соціальних мережах