H
Hunter17626313 января 2017 г. 21:00

Отправка сигнала QML

Signal, Slot, Qt, QML

Доброго времени суток. Я в QT да и в QML новичок, потому прошу помощи. Столкнулся вот с какой загвоздкой, нужно чтоб при отправке сигнала в QML, окно авторизации скрывалось и открывалось другое. Делал по 3 и 20 урокам, с некоторыми изменениями.В общем при отправке сигнала ничего не происходит, не могу понять в чем проблема.

login.cpp(место где происходит отправка сигнала)
 if (count==1){
        // ("username and password is correct");
          emit sendToQml();

     }
login.h
#define LOGIN_H

#include <QSqlQuery>
#include <QObject>
#include <QVariant>

class CLogin : public QObject
{
    Q_OBJECT
public:
    explicit CLogin(QObject *parent = 0);

signals:
    void sendToQml();
public slots:
    void loginSlot();
private:
    int count;

};

#endif // LOGIN_H

main.qml(часть описания окна авторизации)
ApplicationWindow {
    id:logwindow
    visible: true
        width: 540
        height: 380
        title: qsTr("Окно авторизации")

        Material.theme: Material.Light
        Material.primary: Material.Cyan
        Material.accent: Material.Blue

        signal qmlSignal()


        Connections {
               target: clogin

              onSendToQml: {
                       logwindow.hide();
                        window.show();
               }
        }
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

4
Evgenii Legotckoi
  • 4 января 2017 г. 0:38

Добрый день

На первый взгляд всё сделано правильно. Но я не могу утверждать этого до конца, поскольку Вы не привели код из main.cpp файла. А также я не вижу здесь кода, в котором переменная count обнуляется. Если Вы её не обнуляли, то там может быть мусор. А соответственно единицу в этой переменной можете получить очень не скоро.

Вот мой рабочий пример:

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "login.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    QQmlContext* context = engine.rootContext();
    Login login;
    context->setContextProperty("login", &login);
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));

    return app.exec();
}

login.h

#ifndef LOGIN_H
#define LOGIN_H

#include <QObject>

class Login : public QObject
{
    Q_OBJECT
public:
    explicit Login(QObject *parent = 0);

signals:
    void sendToQml();
public slots:
    void loginSlot();
private:
    int count;
};

#endif // LOGIN_H

login.cpp

#include "login.h"

Login::Login(QObject *parent) : QObject(parent), count(0)
{

}

void Login::loginSlot()
{
    count++;
    if (count == 5)
    {
        emit sendToQml();
    }
}

main.qml

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Button {
        text: "Hello"

        onClicked: {
            login.loginSlot()
        }
    }

    Connections {
        target: login
        onSendToQml: {
            console.log("HELLO")
        }
    }
}
    H
    • 4 января 2017 г. 9:53

    Спасибо за приведеный вами выше пример.Но мне нужна немного другая реализация, я хочу чтоб происходило только отправление сигнала, при котором будет происходит скрытие/открытие окон.Прошу прощения что сразу не привел полный код, не хотел загромождать, пока что проблему не удалось решить,по прежнему не скрывается окно авторизации и не открывается новое,хотя по условию count==1 заходит, прилагаю весь код.В чем может быть проблема?

    main.qml

    import QtQuick 2.7
    import QtQuick.Controls 2.0
    import QtQuick.Layouts 1.0
    import QtQuick.Controls.Material 2.0
    import QtQuick.Dialogs 1.2
    import QtQuick.Window 2.0
    
    ApplicationWindow {
        id:logwindow
        visible: true
            width: 540
            height: 380
            title: qsTr("Окно авторизации")
    
            Material.theme: Material.Light
            Material.primary: Material.Cyan
            Material.accent: Material.Blue
    
            signal qmlSignal()
    
    
            Connections {
                   target: clogin
    
                  onSendToQml: {
                           logwindow.hide();
                            window.show();
                   }
            }
    
    
            Column {
                spacing: 10
                anchors.centerIn: parent
    
                TextField {
                    id: login
                    objectName: "login"
                    placeholderText: "Введите Логин"
                    width: 250
    
                }
    
                TextField {
                    id: password
                    objectName: "password"
                    placeholderText: "Введите Пароль"
                    width: 250
                }
    
                Button {
                    id:enter
                    text: qsTr("Войти")
                    width: 250
                    onClicked:{
                        qmlSignal()
                       //logwindow.hide()
    
                    }
    
    
                }
    
                Button {
                    id: reg
                    text: qsTr("Регистрация")
                    width: 250
                }
    
    
            }
            Window {
                id:window
                 title: qsTr("Окно вторичное")
                visible: false
                    width: 540
                    height: 380
            }
    
    
    }
    
    

    main.cpp

    #include <QQmlApplicationEngine>
    #include <connect.h>
    #include <clogin.h>
    #include <QDebug>
    #include <QQmlContext>
    
    
    int main(int argc, char *argv[])
    {
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
        QGuiApplication app(argc, argv);
        QQmlApplicationEngine engine;
        CLogin clogin;
        QQmlContext *context = engine.rootContext();
        context->setContextProperty("clogin",&clogin);
        engine.load(QUrl(QLatin1String("qrc:/main.qml")));
    
        QObject* root = engine.rootObjects()[0];
    
           CLogin *login= new CLogin(root);
           Connect con;
           con.open();
    
    
               QObject::connect(root, SIGNAL(qmlSignal()),
                                login, SLOT(loginSlot()));
    
    
        return app.exec();
    }
    

    clogin.cpp

    #include "clogin.h"
    #include <QString>
    #include <QObject>
    #include <iostream>
    #include <QDebug>
    
    using namespace std;
    
    CLogin::CLogin(QObject *parent) : QObject(parent)
    {
    
    }
    
    void CLogin::loginSlot() {
    
    //Найдем строки ввода
    QObject* field1 = this->parent()->findChild<QObject*>("login");
    QObject* field2 = this->parent()->findChild<QObject*>("password");
    //Найдем поле вывода
    
    //Считаем информацию со строк ввода через свойство text
    QString str1=(field1->property("text")).toString();
    QString str2=(field2->property("text")).toString();
    
    
    QSqlQuery qry;
    
    
    if(qry.exec("select * from clients where client_login='"+str1+"' and client_password='"+str2+"'")){
        count =0;
         while(qry.next())
         {
             count++;
         }
    
         if (count==1){
            // ("username and password is correct");
              emit sendToQml();
    
         }
    
    
         if (count>1)
    
            // ("Duplicate username and password");
         if (count<1)
    
            // ("username and password is not correct");
         if(!count<1||!count>1)
         {
             //открыть окно
         }
    
    
    }
    
    }
    

    clogin.h

    #include <QSqlQuery>
    #include <QObject>
    #include <QVariant>
    
    class CLogin : public QObject
    {
        Q_OBJECT
    public:
        explicit CLogin(QObject *parent = 0);
    
    signals:
        void sendToQml();
    public slots:
        void loginSlot();
    private:
        int count;
    
    };
    
      Evgenii Legotckoi
      • 5 января 2017 г. 7:11
      • Ответ был помечен как решение.

      Вы регистрируете в движке QML в качестве свойства один объект clogin :

      CLogin clogin;
      QQmlContext *context = engine.rootContext();
      context->setContextProperty("clogin",&clogin);
      

      И настраиваете на него Connections

      Connections {
             target: clogin
      
            onSendToQml: {
                     logwindow.hide();
                      window.show();
             }
      }
      

      А сигнал на проверку данных по попытке подключения навешиваете на совершенно другой объект того же самого класса. Поэтому clogin просто простаивает, и не отправляет сигнал в QML, поскольку вы заставляете проверять подключения совершенно другой объект, сигналы которого не обрабатываются в QML.

      CLogin *login= new CLogin(root);
      QObject::connect(root, SIGNAL(qmlSignal()), login, SLOT(loginSlot()));
      
      Так что используйте только один объект, который будет принимать сигнал на попытку входа, обработку данных и будет выдавать сигнал, по которому вы уже переключите окна.

      То есть объедините login и clogin , используйте только один объект

        H
        • 5 января 2017 г. 8:22

        Спасибо Вам большое, все заработало. Я б не догадался). Мне казалось что Conection создал, а дальше делай что хочешь)). Еще раз спасибо большое.

          Комментарии

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

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

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

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

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

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

          • Результат:20баллов,
          • Очки рейтинга-10
          Последние комментарии
          i
          innorwall12 ноября 2024 г. 5:12
          Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
          i
          innorwall12 ноября 2024 г. 1:23
          QML - Урок 035. Использование перечислений в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
          i
          innorwall11 ноября 2024 г. 22:50
          Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
          i
          innorwall11 ноября 2024 г. 21:19
          Алгоритм сортировки кучей The role of raloxifene in preventing breast cancer priligy precio
          i
          innorwall11 ноября 2024 г. 20:55
          PyQt5 - Урок 006. Работа с QTableWidget buy priligy 60 mg 53 have been reported by Javanovic Santa et al
          Сейчас обсуждают на форуме
          i
          innorwall12 ноября 2024 г. 3:56
          добавить qlineseries в функции buy priligy senior brother Chu He, whom he had known for many years
          i
          innorwall11 ноября 2024 г. 17:55
          Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
          9
          9Anonim25 октября 2024 г. 16:10
          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
          ИМ
          Игорь Максимов3 октября 2024 г. 11:05
          Реализация навигации по разделам Спасибо Евгений!

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