R
Rus6lan14 мая 2017 г. 1: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 г. 11: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 г. 12:29

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

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

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

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

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

              R
              • 17 мая 2017 г. 1:35

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

                Evgenii Legotckoi
                • 17 мая 2017 г. 10:06

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

                  Evgenii Legotckoi
                  • 17 мая 2017 г. 10:08

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

                    Комментарии

                    Только авторизованные пользователи могут публиковать комментарии.
                    Пожалуйста, авторизуйтесь или зарегистрируйтесь
                    Ua

                    Qt - Тест 001. Сигналы и слоты

                    • Результат:84баллов,
                    • Очки рейтинга4
                    Ua

                    Qt - Тест 001. Сигналы и слоты

                    • Результат:42баллов,
                    • Очки рейтинга-8
                    ОК

                    Qt - Тест 001. Сигналы и слоты

                    • Результат:47баллов,
                    • Очки рейтинга-6
                    Последние комментарии
                    ИМ
                    Игорь Максимов22 ноября 2024 г. 21:51
                    Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                    Evgenii Legotckoi
                    Evgenii Legotckoi31 октября 2024 г. 23:37
                    Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                    A
                    ALO1ZE19 октября 2024 г. 17:19
                    Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                    ИМ
                    Игорь Максимов5 октября 2024 г. 16:51
                    Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                    d
                    dblas55 июля 2024 г. 20:02
                    QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                    Сейчас обсуждают на форуме
                    f
                    firstlunoxod15 февраля 2025 г. 13:46
                    Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                    Дмитрий
                    Дмитрий3 февраля 2025 г. 16:24
                    Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                    NW
                    Nayo Wai30 января 2025 г. 19:22
                    не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                    n
                    nkly3 января 2025 г. 12:52
                    Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                    M
                    Marsel17 августа 2023 г. 0:26
                    OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

                    Следите за нами в социальных сетях