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
          i
          innorwallNov. 11, 2024, 10:12 p.m.
          Django - Tutorial 055. How to write auto populate field functionality Freckles because of several brand names retin a, atralin buy generic priligy
          i
          innorwallNov. 11, 2024, 6:23 p.m.
          QML - Tutorial 035. Using enumerations in QML without 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
          innorwallNov. 11, 2024, 3:50 p.m.
          Qt/C++ - Lesson 052. Customization Qt Audio player in the style of 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
          innorwallNov. 11, 2024, 2:19 p.m.
          Heap sorting algorithm The role of raloxifene in preventing breast cancer priligy precio
          i
          innorwallNov. 11, 2024, 1:55 p.m.
          PyQt5 - Lesson 006. Work with QTableWidget buy priligy 60 mg 53 have been reported by Javanovic Santa et al
          Now discuss on the forum
          i
          innorwallNov. 11, 2024, 8:56 p.m.
          добавить qlineseries в функции buy priligy senior brother Chu He, whom he had known for many years
          i
          innorwallNov. 11, 2024, 10:55 a.m.
          Всё ещё разбираюсь с кешем. 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
          9AnonimOct. 25, 2024, 9:10 a.m.
          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

          Follow us in social networks