Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB
ПБ
Feb. 1, 2019, 10:02 a.m.

Qt, Qml

Ребята, привет. Такая вот проблема. Есть расчетная функция на стороне с++. Она большая и использует некоторые данные из qml, но иногда они были введены пользователем неправильно. Как мне прекратить вычисления, предупредив об этом пользователя? Желательно через messagedialog, потому что в некоторых случаях мне нужно получить ответ пользователь. (Продолжить вычисления? Да! Нет!).

if(date.isEmpty()) {
  QQmlApplicationEngine engine;
  engine.load(QUrl(QStringLiteral("qrc:/IncorrectDateMessageDialog.qml")));
  return false;
}
MessageDialog {
    title: "Предупреждение"
    icon: StandardIcon.Warning
    text: "Проверьте даты"
    Component.onCompleted: visible = true
    Button {
        text: qsTr("Ok")
        onClicked: visible = false
    }
}

Так окно появляется и сразу исчезает.

Virtual hosting with 10 percent discount
Virtual hosting with 10 percent discount
EVILEG offers reliable hosting with a 10% discount for virtual hosting and 5% for VPS
1

Добрый день!

А как это диалог вызывается? По идее, каким-то образом нужно остановить сами вычисления и ввести их в режим ожидания. Это можно сделать через остановку потока посредством зацикливания на ожидание, но в данном случае можно отхватить зависание приложения. С обычными виджетами это было бы несколько проще, поскольку вычисления можно было бы делать и в главном потоке, а как только появляется message dialog, то вычисления будут ждать ответа от этого диалога, но вот при разделение на C++ и QML это дело нужно правильно синхронизировать.

Я бы для начала вынес вычисления в отдельный поток через moveToThread . А потом в методе вычислений кидал бы сигнал с заапросом на диалоговое окно, при этом сам поток отправлял бы в бесконечный цикл с условием получения кода ответа из QML. Запрос бы кидал в C++ ядро. Далее кидается сигнал в QML, а по ответу да/нет, вызывается слот в C++ ядре, которое также через сигнал/слотовое соединение возвращает код ответа в объект, выполняющий вычисления. Как только ответ получен, то происходит выход из цикла ожидания и вычисления либо прекращаются, либо продолжаются.

Также по возможности сделайте валидацию ещё в QML, до передачи значений в расчёт.

0

Comments

Only authorized users can post comments.
Please, Log in or Sign up
d
April 26, 2019, 2:45 a.m.
djanaibekova_0301@mail.ru

C++ - Тест 003. Условия и циклы

  • Result:42points,
  • Rating points-8
Z
April 25, 2019, 8:02 p.m.
ZadvornyAlexey

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

  • Result:60points,
  • Rating points-1
m
April 24, 2019, 2:30 p.m.
maksImkа

C++ - Тест 003. Условия и циклы

  • Result:50points,
  • Rating points-4
Last comments
April 21, 2019, 4:22 p.m.
Евгений Легоцкой

Через метод setIcon table.horizontalHeaderItem(0).setIcon("qrc://path/to/icon.png")
April 21, 2019, 3:48 p.m.
Евгений Легоцкой

Добрый день! Спасибо за комментарий. Там действительно лучше будет сделать с инициализацией по умолчанию.
U
April 18, 2019, 3:37 p.m.
Unreal_man

А как иконку в хедер задать?
u
April 18, 2019, 2:15 a.m.
uaa

доброго времени,большое спасибо за пример для начинающего)при адаптации к своему проекту столкнулся с таким ньансом:в vepolyline.h в 47 строке нужна инициализация по умолчанию: int m_pointF...
E
April 11, 2019, 12:49 p.m.
Evgeny

Спасибо за ответ) У меня компоновщик на нее ругался просто. Оказалось, просто забыл Q_OBJECT в начале класса указать.
Now discuss on the forum
April 25, 2019, 10:51 a.m.
Ruslan Polupan

Изменил функциютеперь работает. bool ModelTerminals::setData(const QModelIndex &index, const QVariant &value, int role){ Q_UNUSED(role) if(!index.isValid()) {return false;...
April 24, 2019, 6:20 a.m.
Ruslan Polupan

я так понимаю надо инфорация об устройствах.Я бы пробовал так rust@suse:~> lsblk -PNAME="sda" MAJ:MIN="8:0" RM="0" SIZE="111,8G" RO="0" TYPE="disk" MOUNTPOINT=""NAME="sda1" MAJ:MIN="8...
April 21, 2019, 4:16 p.m.
Евгений Легоцкой

Приветствую Нужно сохранять где-то выбранное значение, а потом восстанавливать его. Или использовать QSettings или добавить метод open(), в который передавать начальные значения для того...
R
April 19, 2019, 9:55 a.m.
RED_Spider

мені важко це зараз навіть перевірити, тому що знайшов коміт, це ще було в 2016 році, і цей код не буде працювати коректно зараз, єдине скажу що це були QThread
Join us in social networks

For registered users on the site there is a minimum amount of advertising