H
Hunter1762631Jan. 3, 2017, 8 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.
4

Добрый день

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

Спасибо за приведеный вами выше пример.Но мне нужна немного другая реализация, я хочу чтоб происходило только отправление сигнала, при котором будет происходит скрытие/открытие окон.Прошу прощения что сразу не привел полный код, не хотел загромождать, пока что проблему не удалось решить,по прежнему не скрывается окно авторизации и не открывается новое,хотя по условию 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;

};

Вы регистрируете в движке 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

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

Comments

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

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting
V
  • Vitreg
  • Oct. 26, 2020, 1:35 a.m.

C++ - Test 001. The first program and data types

  • Result:73points,
  • Rating points1
V
  • Vitreg
  • Oct. 26, 2020, 1:23 a.m.

C++ - Test 005. Structures and Classes

  • Result:83points,
  • Rating points4
K
  • Kanes
  • Oct. 25, 2020, 8:42 a.m.

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

  • Result:60points,
  • Rating points-1
Last comments
S

QML - Lesson 026. Intents with Qt for Android, part 1

Есть ли возможность приведения java типа у QAndroidJniObject? Интересует конкретно class to
VK

Qt/C++ - Lesson 015. QTableWidget – How to create a table with checkboxes?

Кто-нибудь знает, как сделать так, чтобы в QTableWidget состоящей из чекбоксов в строке таблицы можно было выбрать только один checkbox ?

Qt/C++ - Lesson 006. QSqlQueryModel – Tables in Qt with SQL-query

QSqlTableModel выполняет ряд стандартных операций для одной таблицы из базы данных. Поэтому там и реализован функционал по удалению и редактированию. QSqlQueryModel позволяет выполнить запр…
VB

Qt/C++ - Lesson 006. QSqlQueryModel – Tables in Qt with SQL-query

Добрый день. Хотел спросить вот что. Создал проект на основе QAbstractTableModel. В MainWindow cоответственно создал модель и связал с представлением. Поиск веду по списку элементов модели,…

QCheckBox в качестве делегата QTableView

До тех пор, пока у вас проект содержит только одну таблицу, или несколько то может быть. Когда их будет 1000 и чекбоксы в разных колонках, то без делегатов и переопределения возвращаемых ре…
Now discuss on the forum

QSqlTableModel - Как добавить картинки в таблицу, чтобы они отражались в диалоговом окне, но не были частью модели

Ну тогда в этом столбце указывайте пути на несколько картинок
u
  • ubomj
  • Oct. 27, 2020, 9:34 a.m.

Создание черновика как на авито и тд

Ну пользователь я думаю не настроен будет жмакать кнопку создать черновик, потом продолжать заполнять... А черновик в свою очередь нужен пока только для получения id, который нужен для муль…

QGraphicItems объекты

спасибо
  • BlinCT
  • Oct. 24, 2020, 6:14 a.m.

Открытие файла и чтение данных из него по средством башевского запроса

И так же интересно как в случаи чтения из потока таким путем можно узнавать об окончании файла?
KM

Qt анимация диалога c++

Хочу сдедать диалог который будет выпадать с помощью анимации Анимация готова но я не знаю как попровать ее так чтобы мой диалог выезжал с верху на центр, при закрытии диалог заезжает навер…
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB