根据需要在一个QQuickwidget上交替显示2个QML文件,而不会重叠

时间:2019-02-14 16:38:10

标签: c++ qt qml

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

我能够做到这一点,但是我的第二个QML文件在QQuickwidget的中间部分和其他地方重叠了。

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

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

用于加载第一个QML文件(main.qml)的C ++函数

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文件(main1.qml)的C ++函数

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

1 个答案:

答案 0 :(得分: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个QuickWidget并使用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