0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 2
1

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

04.01.2017, 22:01. Показов 1846. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.Возникла вот какая проблема.Нужно чтоб при отправке из QT сигнала в QML закрывалось окно авторизации и открывалось вторичное.Но почему то ничего не происходит, хотя по условию count=1 в слоте loginSlot() login.cpp заходит.В чем может быть проблема?
main.qml

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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
        }
 
 
}
clogin.h

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <QSqlQuery>
#include <QObject>
#include <QVariant>
 
class CLogin : public QObject
{
    Q_OBJECT
public:
    explicit CLogin(QObject *parent = 0);
 
signals:
    void sendToQml();//сигнал для отправки в QML
public slots:
    void loginSlot();
private:
    int count;
 
};
clogin.cpp

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#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();//отправка сигнала в QML
 
     }
 
 
     if (count>1)
 
        // ("Duplicate username and password");
     if (count<1)
 
        // ("username and password is not correct");
     if(!count<1||!count>1)
     {
         //открыть окно
     }
 
 
}
 
}
main.cpp

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#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();
}
 Комментарий модератора 
Ставьте теги правильно!
Правила именования тем и оформления сообщений в разделе Qt
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.01.2017, 22:01
Ответы с готовыми решениями:

Emit сигнала в QML
Допустим у меня есть квадрат 50х50 Rectangle{ width: 100; height: 100; signal...

Передача сигнала из c++ кода в qml слот
Добрго времени суток! Начал изучать Qml и столкнулся с пблемой передачи сигнала из С++ кода в qml...

Подсветка QML элементов QML-ного плагина в QtCreator в случае нахождения QML файлов плагина в ресурсах!
Здравствуйте! Если сделать плагин для QML и подключить его в основном проекте ну как - то так:...

Отправка сигнала
Есть класс : class Tree:public QTreeWidget { public: Tree(); virtual void...

1
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
06.01.2017, 15:50 2
Возможно из-за того, что
A Window can be declared inside an Item or inside another Window; in that case the inner Window will automatically become "transient for" the outer Window
https://doc-snapshots.qt.io/qt... indow.html

Вообще в таком случае советую использовать StackView, а не городить кучу сменяющихся окон.
0
06.01.2017, 15:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.01.2017, 15:50
Помогаю со студенческими работами здесь

Банальная отправка сигнала от окна к окну
Посмотрел несколько примеров, понять не могу, что я делаю не так, что не работает. Программа...

Произвольная отправка сигнала через emit
Коннект работает не корректно, после сигнала не заходит в нужную функцию помогите пожалуйста emit...

Отправка сигнала в слот объекта без явного подключения
Есть два объекта А и Б. У объекта Б есть слот incomingSlot() Нужно из объекта А послать как - то...

QMl/QT при нажатии на кнопку должен окрыться другой qml файл
Додал anchors Вот что я сделал: import QtQuick 2.5 import QtQuick.Controls 1.4 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru