Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Qt

Войти
Регистрация
Восстановить пароль
 
Mixxxxa
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 26
#1

Передать класс в QML при запуске приложения - C++ Qt

10.01.2017, 21:12. Просмотров 241. Ответов 7
Метки qml, qt (Все метки)

Здравствуйте. Мне нужно передать в QML класс (в моем случае с настройками), до того, как будет загружен main.qml

Сейчас работает так:
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
int main(int argc, char *argv[]){
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
    QQuickStyle::setStyle("Material");
 
    QQmlApplicationEngine engine;
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));
 
    QObject *root = engine.rootObjects()[0];
    QQmlContext *rootContext = engine.rootContext();
    appSettings *settings = new appSettings(root);
    signalHandler *handler = new signalHandler(root, rootContext, settings);
 
    rootContext->setContextProperty("appSettings", settings); //[I]Место добавления нужного класса[/I]
    
    //Остальные классы
    qmlRegisterUncreatableType<servoListModel>("dataModels", 1, 0, "ServoListModel", "can't create servo list");
    qmlRegisterUncreatableType<engineListModel>("dataModels", 1, 0, "EngineListModel", "can't create engine list");
    qmlRegisterUncreatableType<bluetoothModel>("dataModels", 1, 0, "BluetoothModel", "can't create bluetooth list");
 
    //Сигналы и прочее
 
    return app.exec();
}
Часть 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
ApplicationWindow {
    id: mainWindow
 
    width: 640;
    height: 480;
    visible: true;
    title: "Имя программы"
    
    //То, что должно подгружаться из настроек:
    Material.theme: appSettings.theme
    Material.primary: appSettings.mainColor
    Material.accent: appSettings.accentColor
 
    property bool isTablet: width > height ? true : false
    property int keyboardHeight: Qt.inputMethod.keyboardRectangle.height / Screen.devicePixelRatio
    
    //Сигналы
 
    //Функции
 
    StackView{
        id: mainStack
        objectName: "mainStack"
   
    //Параметры
 
        anchors.fill: parent
 
        focus: true
        onCurrentItemChanged: currentItem ? currentItem.forceActiveFocus() : console.log("null object")
 
        initialItem: SelectConnectTypePage {}
 
    }
}
В таком варианте настройки не подхватываются при старте до тех пор, пока не будут изменены.
Если переделать main.cpp, так чтобы main.qml загружался позже:
C++ (Qt)
1
2
3
4
5
6
7
8
9
    QQmlApplicationEngine engine;
     
    QObject *root = engine.rootObjects()[0]; [B]//В таком случае падает здесь[/B]
    QQmlContext *rootContext = engine.rootContext();
    appSettings *settings = new appSettings(root);
    signalHandler *handler = new signalHandler(root, rootContext, settings); 
    rootContext->setContextProperty("appSettings", settings); //[I]Место добавления нужного класса[/I]
 
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));
То в таком варианте программа падает на старте (строку падения выделил) с таким выхлопом в консоль:
Код
Запускается C:\Qt\Projects\build-ARC-Desktop_Qt_5_7_1_MinGW_32bit-Debug\debug\ARC.exe...
QML debugging is enabled. Only use this in a safe environment.
ASSERT failure in QList<T>::operator[]: "index out of range", file ..\..\5.7\mingw53_32\include/QtCore/qlist.h, line 545
C:\Qt\Projects\build-ARC-Desktop_Qt_5_7_1_MinGW_32bit-Debug\debug\ARC.exe завершился с кодом 3
Как можно решить эту проблему?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2017, 21:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передать класс в QML при запуске приложения (C++ Qt):

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

Ошибка при запуске приложения - C++ Qt
Я скачал QT creator на Windows 10,попробовал запустить,для теста,программу,и выдало мне следующую ошибку Error while building/deploying...

Задержка при запуске приложения - C++ Qt
Надо выставить задержку при запуске приложения, есть такая функция main: QTextCodec *codec = QTextCodec::codecForName(&quot;UTF-8&quot;); ...

Warning при запуске приложения - C++ Qt
Когда я запускаю свое приложение, в консоль выводится &quot;Qt Warning - invalid keysym: dead_actute&quot; А когда открываю диалог сохранения ...

При запуске приложения ничего не происходит - C++ Qt
Делаю парсер Excel файлов, все было нормально, но сегодня открываю Qt Creator, жмякаю F5 и ничего... Приложение не запускается, ошибок нет,...

Спрятать окно при запуске приложения - C++ Qt
Необходимо запустить программу, но, чтобы главная форма находилась в скрытом состоянии. Должен отображаться только QSystemTrayIcon, а далее...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Wyn
Модератор
1043 / 625 / 230
Регистрация: 14.01.2016
Сообщений: 2,002
Записей в блоге: 9
10.01.2017, 21:41 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Mixxxxa Посмотреть сообщение
Как можно решить эту проблему?
Убрать QObject *root. Он не нужен, можно прекрасно обойтись и без него.
1
Mixxxxa
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 26
11.01.2017, 13:19  [ТС] #3
Цитата Сообщение от Wyn Посмотреть сообщение
Он не нужен, можно прекрасно обойтись и без него
Да, чуток переделал. Теперь он появляется позже, но совсем без него нельзя, т.к. к нему у меня подключаются сигналы/слоты.
0
Wyn
Модератор
1043 / 625 / 230
Регистрация: 14.01.2016
Сообщений: 2,002
Записей в блоге: 9
11.01.2017, 14:12 #4
Цитата Сообщение от Mixxxxa Посмотреть сообщение
Да, чуток переделал. Теперь он появляется позже, но совсем без него нельзя, т.к. к нему у меня подключаются сигналы/слоты.
При чём тут сигналы/слоты? Они работают у любого объекта в QML, унаследованного от QObject.
0
Mixxxxa
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 26
12.01.2017, 02:27  [ТС] #5
Цитата Сообщение от Wyn Посмотреть сообщение
При чём тут сигналы/слоты
У меня дальше по коду от этого *root подключатся QML сигналы к C++ слотам.
Примерно вот так:
C++ (Qt)
1
2
3
QObject::connect(root, SIGNAL(saveAppData(QString)), handler, SLOT(saveSettings(QString)));
    QObject::connect(root, SIGNAL(loadAppData(QString)), handler, SLOT(loadSettings(QString)));
    QObject::connect(root, SIGNAL(updateSaves()), handler, SLOT(updateSettingsList()));
0
Wyn
Модератор
1043 / 625 / 230
Регистрация: 14.01.2016
Сообщений: 2,002
Записей в блоге: 9
12.01.2017, 08:20 #6
Цитата Сообщение от Mixxxxa Посмотреть сообщение
У меня дальше по коду от этого *root подключатся QML сигналы к C++ слотам.
Все подобные связи лучше описываться в QML, но никак не наоборот. Есть мнение, что у вас не всё в порядке с архитектурой, раз приходится идти на подобные махинации. Постарайтесь её переосмыслить и тщательнее обдумать.
0
Mixxxxa
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 26
12.01.2017, 18:49  [ТС] #7
Цитата Сообщение от Wyn Посмотреть сообщение
Есть мнение, что у вас не всё в порядке с архитектурой, раз приходится идти на подобные махинации.
Все может быть. Все-же новичок еще. Посмотрите, может можно это сделать лучше, я буду только рад конструктивной критике.
Сейчас все обстоит так:

QML чисто для интерфейса.
С++ для управления подключениями различными типами сетевых под, хранения настроек, и создания кастомных моделей данных.
Все сигналы/слоты проходят через С++ класс (signalHandler), который передает команды других модулям и следит за их выполнением (такой вот переходник).
Те сигналы/слоты которые не будут меняться во время работы программы объявлены в main.cpp, а остальные привязываются signalHandler'ом при необходимости.
Тот QObject *root необходим для того чтобы связать QML сигналы и С++ слоты в начале, а так-же во время работы программы.
0
Wyn
Модератор
1043 / 625 / 230
Регистрация: 14.01.2016
Сообщений: 2,002
Записей в блоге: 9
12.01.2017, 20:04 #8
Цитата Сообщение от Mixxxxa Посмотреть сообщение
Все сигналы/слоты проходят через С++ класс (signalHandler), который передает команды других модулям и следит за их выполнением (такой вот переходник).
Обычно всё, что связано с QML из QML должно быть доступно. Не помню у себя ни одной программы где бы это было не так. Если вы начнёте работать в обход QML, то начнут появляться крайне неудобные грабли и углы, потому что QML на подобную работу не рассчитан.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2017, 20:04
Привет! Вот еще темы с ответами:

Передать QImage в QML - C++ Qt
Добрый день! Уже очень долго не могу решить вопрос о передаче QImage в QML. Нашла в интернете, что есть класс QImageProvider и пример его...

QGraphicsScene/View - пробелмы при запуске приложения - C++ Qt
Всем привет. В кратце о приложении - одна экранная форма, на которой отображается карта местности с координатной сеткой, пользователь...

QML передать нужно путь правильно - C++ Qt
У меня есть main.cpp и main.qml. В main.cpp передаю путь чтобы вывести на екран. Создаю qrc, додаю туда main.qml Код: #include...

Передать значение из одного QML файла в другой - C++ Qt
День добрый. Подскажите, как передать значение из одного QML файла в другой? В документации вообще непонятный пример по signal для...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.01.2017, 20:04
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru