отображать 2 файла QML на одном QQuickwidget попеременно, когда это необходимо, без наложения - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть QQuickwidget в приложении Qt C ++, где я загрузил файл QML (main.qml) и, используя функции QAction (actionstart) и C ++, мне нужно загрузить другой файл QML (main1.qml), немного отличающийся от предыдущегона том же объекте QQuickWidget.

Я могу это сделать, но мой 2-й файл QML перекрывается из средней части QQuickwidget и далее.

Я сделал это, чтобы остановить наложение 2QML-файлы, но не полностью.count3 = 1 определено в открытом разделе файла Guiapplication.h.

void GuiApplication::on_actionstart_triggered()
{
if (count3 == 1)
{
  set_animation();
  count3 = 2;
}
}

C ++ Функция для загрузки 1-го файла QML (main.qml)

void GuiApplication::rolling_animation()
{
QQuickView *quickWidget=new QQuickView();
QWidget *contain = QWidget::createWindowContainer(quickWidget,this);
contain->setMinimumSize(1008,349);
contain->setMaximumSize(1008,349);
contain->setFocusPolicy(Qt::TabFocus);
quickWidget->setSource(QUrl("qrc:/Resources/main.qml"));
ui->horizontalLayout_6->addWidget(contain);
}

C ++ Функция для загрузки 2-го QMLфайл (main1.qml)

void GuiApplication::set_animation()
{
QQuickView *quickWidget=new QQuickView();
QWidget *Contain = QWidget::createWindowContainer(quickWidget,this);
Contain->setMinimumSize(1008,349);
Contain->setMaximumSize(1008,349);
Contain->setFocusPolicy(Qt::TabFocus);
quickWidget->setSource(QUrl("qrc:/Resources/main1.qml"));
ui->horizontalLayout_6->addWidget(Contain);
//ui->horizontalLayout_9->invalidate();
//ui->horizontalLayout_9->removeWidget(quickWidget_4);
}

изображение окна вывода

1 Ответ

0 голосов
/ 15 февраля 2019

В зависимости от того, хотите ли вы сохранить или нет состояние QML, которое вы хотите скрыть, существуют следующие альтернативы:

  1. Отклонить тот же QQuickWidget (я рекомендую изменить QQuickView на QQuickWidget) ипросто измените источник.

#include <QtQuickWidgets>

class Widget: public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent=nullptr):
        QWidget(parent),
        m_widget(new QQuickWidget)
    {
        m_widget->setResizeMode(QQuickWidget::SizeRootObjectToView);
        QPushButton *button1 = new QPushButton("show 1");
        QPushButton *button2 = new QPushButton("show 2");

        QHBoxLayout *lay = new QHBoxLayout(this);
        QVBoxLayout *vlay = new QVBoxLayout;
        vlay->addWidget(button1);
        vlay->addWidget(button2);
        lay->addLayout(vlay);
        lay->addWidget(m_widget);

        connect(button1, &QPushButton::clicked, this, &Widget::show1);
        connect(button2, &QPushButton::clicked, this, &Widget::show2);
        show1();
    }
private slots:
    void show1(){
        m_widget->setSource(QUrl("qrc:/main1.qml"));
    }
    void show2(){
        m_widget->setSource(QUrl("qrc:/main2.qml"));
    }
private:
    QQuickWidget *m_widget;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

#include "main.moc"
Используйте 2 QuickWidgets и QStackedWidget для переключения виджетов, причем этот метод скрыт, поэтому состояние QML будет сохраняться, в предыдущем случае, когда изменение источника потеряно.
#include <QtQuickWidgets>

class Widget: public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent=nullptr):
        QWidget(parent),
        m_stacked_widget(new QStackedWidget)
    {
        for(const QString & url: {"qrc:/main1.qml", "qrc:/main2.qml"}){
            QQuickWidget *widget = new QQuickWidget;
            widget->setResizeMode(QQuickWidget::SizeRootObjectToView);
            widget->setSource(QUrl(url));
            m_stacked_widget->addWidget(widget);
        }
        QPushButton *button1 = new QPushButton("show 1");
        QPushButton *button2 = new QPushButton("show 2");

        QHBoxLayout *lay = new QHBoxLayout(this);
        QVBoxLayout *vlay = new QVBoxLayout;
        vlay->addWidget(button1);
        vlay->addWidget(button2);
        lay->addLayout(vlay);
        lay->addWidget(m_stacked_widget);

        connect(button1, &QPushButton::clicked, this, &Widget::show1);
        connect(button2, &QPushButton::clicked, this, &Widget::show2);
        show1();
    }
private slots:
    void show1(){
        m_stacked_widget->setCurrentIndex(0);
    }
    void show2(){
        m_stacked_widget->setCurrentIndex(1);
    }
private:
    QStackedWidget *m_stacked_widget;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

#include "main.moc"

Примеры можно найти здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...