Russian Qt Forum

Qt => Qt Quick => Тема начата: BuRn от Февраль 08, 2014, 11:05



Название: Qml динамический компонент
Отправлено: BuRn от Февраль 08, 2014, 11:05
Добрый день. Подскажите, какие есть способы, разместить элемент по верх главного qml файла и элементов вместе с ними. Требуется сделать что-то типа MessageBox, который будет перекрывать все остальные компоненты главного qml файла. Создание производиться из сишника


Название: Re: Qml динамический компонент
Отправлено: OKTA от Февраль 08, 2014, 14:18
Так просто создаешь еще один QDeclarativeView, у которого source и есть твой messageBox! Я так делаю)


Название: Re: Qml динамический компонент
Отправлено: BuRn от Февраль 08, 2014, 14:40
Так просто создаешь еще один QDeclarativeView, у которого source и есть твой messageBox! Я так делаю)
Дык когда я сделаю setSource разве он не перекроет/затрет весь уже отрисованный контент?


Название: Re: Qml динамический компонент
Отправлено: OKTA от Февраль 08, 2014, 15:30
таки чем он перекроет? это же будет отдельное окно - задай ему координаты при создании и все будет ок)


Название: Re: Qml динамический компонент
Отправлено: BuRn от Февраль 08, 2014, 16:11
таки чем он перекроет? это же будет отдельное окно - задай ему координаты при создании и все будет ок)
Честно говоря, всегда, когда писал на QML, считал что в программе написанной на QML должно быть одно окно... Пасибо, попробую


Название: Re: Qml динамический компонент
Отправлено: vregess от Февраль 08, 2014, 16:46
Так просто создаешь еще один QDeclarativeView, у которого source и есть твой messageBox! Я так делаю)

Вообще странный совет. Можно просто создать прозрачный слой на всю сцену поверх всех элементов (меняй z-index), который будет перехватывать события мыши. А поверх него свой диалог.
Когда я делал, то были проблемы с MouseArea - некоторые события передавали ниже, точно уже не помню. Поэтому я писал свой класс:

Layer.qml:
Код:
import QtQuick 2.0
import aux.tools 1.0

/**
 * Used to stop mouse events propagation to lower items on the stack.
 * MouseBlocker is a c++ class.
 * See Contentx.cpp and gui/MouseBlocker.cpp
 */
Rectangle {
    MouseBlocker {anchors.fill: parent}
}

MouseBlocker.cpp:
Код:
#include "gui/MouseBlocker.h"
#include "common/setDebugNew.h"

MouseBlocker::MouseBlocker(QQuickItem *parent)
: QQuickItem(parent)
{
    //setAcceptHoverEvents(true);
    setAcceptedMouseButtons(Qt::AllButtons);
    setCursor(Qt::ArrowCursor);
}
//------------------------------------------------------------------------------

void MouseBlocker::hoverEnterEvent(QHoverEvent *event)
{
    event->accept();
}
//------------------------------------------------------------------------------

void MouseBlocker::hoverLeaveEvent(QHoverEvent *event)
{
    event->accept();
}
//------------------------------------------------------------------------------

void MouseBlocker::hoverMoveEvent(QHoverEvent *event)
{
    event->accept();
}   

void MouseBlocker::mouseMoveEvent(QMouseEvent *event)
{
    event->accept();
}
//------------------------------------------------------------------------------

void MouseBlocker::mousePressEvent(QMouseEvent *event)
{
    event->accept();
}
//------------------------------------------------------------------------------

void MouseBlocker::mouseReleaseEvent(QMouseEvent *event)
{
    event->accept();
}
//------------------------------------------------------------------------------

void MouseBlocker::wheelEvent(QWheelEvent *event)
{
    event->accept();
}
//------------------------------------------------------------------------------

Ну всякие мелочи я не описываю, навроде как создать и показать из с++.


Название: Re: Qml динамический компонент
Отправлено: OKTA от Февраль 08, 2014, 17:03
Если создавать внутри главное сцены, то за пределы сцены объект не вылезет, а если отдельным, то будет полноценное окошко самостоятельное. Очень удобно использовать для красивых всплывающих сообщений в трее и для тех же messagebox, Если надо показать его, а основное приложение свернуто.


Название: Re: Qml динамический компонент
Отправлено: vregess от Февраль 08, 2014, 17:20
Возможно при некоторых обстоятельствах отдельное окно и будет удобнее. Просто мой ход мыслей схож с ТС
Честно говоря, всегда, когда писал на QML, считал что в программе написанной на QML должно быть одно окно


Название: Re: Qml динамический компонент
Отправлено: OKTA от Февраль 08, 2014, 17:50
не стоит себя ограничивать такими условностями  ;)


Название: Re: Qml динамический компонент
Отправлено: BuRn от Февраль 08, 2014, 21:11
не стоит себя ограничивать такими условностями  ;)
Вероятно, в вашем случае, можно обломаться с прозрачностью... Свойства opacity главного ректангла того же MessageBox уже не установить...


Название: Re: Qml динамический компонент
Отправлено: OKTA от Февраль 09, 2014, 00:12
Почему не установить? покажите код-пруф))


Название: Re: Qml динамический компонент
Отправлено: BuRn от Февраль 09, 2014, 00:27
Почему не установить? покажите код-пруф))
Я предположил, ибо будет новое окно...


Название: Re: Qml динамический компонент
Отправлено: OKTA от Февраль 09, 2014, 01:54
Все там устанавливается, попробуй))) На личном опыте проверено!)


Название: Re: Qml динамический компонент
Отправлено: BuRn от Февраль 09, 2014, 14:07
Все там устанавливается, попробуй))) На личном опыте проверено!)
В любом случае спасибо, будем тестить и проверять как оно на деле работает