H
Hunter17626313. Januar 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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

4
Evgenii Legotckoi
  • 4. Januar 2017 00: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. Januar 2017 09: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. Januar 2017 07:11
      • Die Antwort wurde als Lösung markiert.

      Вы регистрируете в движке 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. Januar 2017 08:22

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

          Kommentare

          Nur autorisierte Benutzer können Kommentare posten.
          Bitte Anmelden oder Registrieren
          Letzte Kommentare
          ИМ
          Игорь Максимов5. Oktober 2024 07:51
          Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
          d
          dblas55. Juli 2024 11:02
          QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
          k
          kmssr8. Februar 2024 18:43
          Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
          Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
          EVA
          EVA25. Dezember 2023 10:30
          Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
          Jetzt im Forum diskutieren
          J
          JacobFib17. Oktober 2024 03:27
          добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
          JW
          Jhon Wick1. Oktober 2024 15:52
          Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
          КГ
          Кирилл Гусарев27. September 2024 09:09
          Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
          F
          Fynjy22. Juli 2024 04:15
          при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

          Folgen Sie uns in sozialen Netzwerken