H
Hunter1762631Jan. 3, 2017, 9 p.m.

Отправка сигнала 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();
               }
        }
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

4
Evgenii Legotckoi
  • Jan. 4, 2017, 12:38 a.m.

Добрый день

На первый взгляд всё сделано правильно. Но я не могу утверждать этого до конца, поскольку Вы не привели код из 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
    • Jan. 4, 2017, 9:53 a.m.

    Спасибо за приведеный вами выше пример.Но мне нужна немного другая реализация, я хочу чтоб происходило только отправление сигнала, при котором будет происходит скрытие/открытие окон.Прошу прощения что сразу не привел полный код, не хотел загромождать, пока что проблему не удалось решить,по прежнему не скрывается окно авторизации и не открывается новое,хотя по условию 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
      • Jan. 5, 2017, 7:11 a.m.
      • The answer was marked as a solution.

      Вы регистрируете в движке 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
        • Jan. 5, 2017, 8:22 a.m.

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

          Comments

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

          C ++ - Test 004. Pointers, Arrays and Loops

          • Result:50points,
          • Rating points-4
          m

          C ++ - Test 004. Pointers, Arrays and Loops

          • Result:80points,
          • Rating points4
          m

          C ++ - Test 004. Pointers, Arrays and Loops

          • Result:20points,
          • Rating points-10
          Last comments
          ИМ
          Игорь МаксимовNov. 22, 2024, 7:51 p.m.
          Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
          Evgenii Legotckoi
          Evgenii LegotckoiOct. 31, 2024, 9:37 p.m.
          Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
          A
          ALO1ZEOct. 19, 2024, 3:19 p.m.
          Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
          ИМ
          Игорь МаксимовOct. 5, 2024, 2:51 p.m.
          Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
          d
          dblas5July 5, 2024, 6:02 p.m.
          QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
          Now discuss on the forum
          Evgenii Legotckoi
          Evgenii LegotckoiJune 24, 2024, 10:11 p.m.
          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
          t
          tonypeachey1Nov. 15, 2024, 2:04 p.m.
          google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
          NSProject
          NSProjectJune 4, 2022, 10:49 a.m.
          Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
          9
          9AnonimOct. 25, 2024, 4:10 p.m.
          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

          Follow us in social networks