在需要时,在一个QQuickwidget上交替显示2个QML文件,不重叠

问题描述 投票:-1回答:1

我在Qt C ++应用程序中有一个QQuickwidget,我已经加载了一个QML文件(main.qml)并使用QAction(actionstart)和C ++函数我必须加载另一个QML文件(main1.qml)与之前的一个略有不同QQuickWidget对象。

我能够做到这一点,但是我的第二个QML文件与QQuickwidget的中间部分重叠了。

我这样做是为了阻止2个QML文件的重叠但完全没有成功。 count3 = 1在Guiapplication.h文件的公共部分中定义。

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

用于加载第一个QML文件的C ++函数(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);
}

用于加载第二个QML文件的C ++函数(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);
}

output window image

c++ qt qml
1个回答
0
投票

根据您是否要保存要隐藏的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"
  1. 使用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"

这些例子可以找到here

© www.soinside.com 2019 - 2024. All rights reserved.