【问题标题】:How to display QML in the center with QQuickWidget inside QTabWidget?如何在 QTabWidget 中使用 QQuickWidget 在中心显示 QML?
【发布时间】:2020-06-10 08:55:52
【问题描述】:

我正在尝试使用 QQuickWidget 显示自定义 listView。 因为我需要两个listView:一个用于搜索结果,一个用于队列, 我使用 QTabWidget 在这两个 QQuickWidget 之间切换。

我还没有完成 listView 的制作(因为我是这方面的初学者) 所以我即兴创作了我的 QML 来测试它是否像我上面输入的那样工作。 当我运行我的应用程序时,QTabWidget 内部的 QML 意外显示。

它应该像下面的 QQuickWidget 一样显示一个黄色矩形和文本,但它显示的文本在左上角对齐,没有黄色矩形。

应用程序执行时

[我尝试过的事情] 我认为这是因为我将 QQuickWidget 放在每个选项卡的 QWidget 中,所以我将这些 QWidget 提升为具有 QQuickWidget 但没有任何改变的自定义页面。

ma​​in.py

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5 import uic
from PyQt5.QtQuickWidgets import QQuickWidget
from myresulttab import myResultTab
from myqueuetab import myQueueTab

#loading UI file
form_class = uic.loadUiType("mainWindowUI.ui")[0]

class WindowClass(QMainWindow, form_class) :

    def __init__(self) :
        super().__init__()
        self.setupUi(self)

        self.testQuickWidget.setSource(QUrl.fromLocalFile("resultTabQml.qml"))


if __name__ == "__main__" :

    app = QApplication(sys.argv) 
    myWindow = WindowClass() 
    myWindow.show()
    app.exec_()

ma​​inWindowUI.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>555</width>
    <height>821</height>
   </rect>
  </property>
  <property name="font">
   <font>
    <family>NanumGothic</family>
    <pointsize>10</pointsize>
    <weight>50</weight>
    <italic>false</italic>
    <bold>false</bold>
   </font>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <property name="styleSheet">
   <string notr="true"/>
  </property>
  <widget class="QWidget" name="centralwidget">
   <property name="styleSheet">
    <string notr="true"/>
   </property>
   <layout class="QGridLayout" name="gridLayout" rowstretch="50,5,45,0" columnstretch="70,0">
    <property name="verticalSpacing">
     <number>15</number>
    </property>
    <item row="2" column="0" colspan="2">
     <widget class="QQuickWidget" name="testQuickWidget">
      <property name="resizeMode">
       <enum>QQuickWidget::SizeRootObjectToView</enum>
      </property>
     </widget>
    </item>
    <item row="0" column="0" colspan="2">
     <widget class="QTabWidget" name="tabWidget">
      <property name="currentIndex">
       <number>0</number>
      </property>
      <property name="elideMode">
       <enum>Qt::ElideNone</enum>
      </property>
      <widget class="myResultTab" name="resultTab">
       <property name="font">
        <font>
         <family>NanumGothic</family>
         <pointsize>10</pointsize>
         <weight>50</weight>
         <italic>false</italic>
         <bold>false</bold>
        </font>
       </property>
       <attribute name="title">
        <string>검색창</string>
       </attribute>
      </widget>
      <widget class="myQueueTab" name="queueTab">
       <property name="autoFillBackground">
        <bool>false</bool>
       </property>
       <attribute name="title">
        <string>QUEUE</string>
       </attribute>
      </widget>
     </widget>
    </item>
    <item row="1" column="0">
     <widget class="QLabel" name="console">
      <property name="sizePolicy">
       <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
      </property>
      <property name="font">
       <font>
        <family>NanumGothic</family>
        <pointsize>10</pointsize>
        <weight>50</weight>
        <italic>false</italic>
        <bold>false</bold>
       </font>
      </property>
      <property name="toolTip">
       <string extracomment="프로그램이 당신에게 보내는 편지입니다. 다정하게 대해주세요 :)"/>
      </property>
      <property name="text">
       <string>resultTabQML.qml should be displayed like this!</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>555</width>
     <height>20</height>
    </rect>
   </property>
   <widget class="QMenu" name="menu_F">
    <property name="title">
     <string>파일(&amp;F)</string>
    </property>
   </widget>
   <widget class="QMenu" name="menu_E">
    <property name="title">
     <string>편집(&amp;E)</string>
    </property>
    <addaction name="separator"/>
    <addaction name="separator"/>
   </widget>
   <addaction name="menu_F"/>
   <addaction name="menu_E"/>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <customwidgets>
  <customwidget>
   <class>QQuickWidget</class>
   <extends>QWidget</extends>
   <header location="global">QtQuickWidgets/QQuickWidget</header>
  </customwidget>
  <customwidget>
   <class>myResultTab</class>
   <extends>QWidget</extends>
   <header>myresulttab.h</header>
   <container>1</container>
  </customwidget>
  <customwidget>
   <class>myQueueTab</class>
   <extends>QWidget</extends>
   <header>myqueuetab.h</header>
   <container>1</container>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
 <slots>
  <slot>inquireDataBtnPressed()</slot>
  <slot>insertDataBtnPressed()</slot>
  <slot>deleteDataBtnPressed()</slot>
  <slot>updateDataBtnPressed()</slot>
  <slot>getDataFromApiBtnPressed()</slot>
 </slots>
</ui>

myResultTab.py

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtQuickWidgets import QQuickWidget

class myResultTab(QWidget):

    def __init__(self):
        super().__init__()
        layout = QVBoxLayout(self)
        resultQuickWidget = QQuickWidget(QUrl.fromLocalFile("resultTabQml.qml"))
        layout.addWidget(resultQuickWidget)
        self.setLayout(layout)

myQueueTab.py

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtQuickWidgets import QQuickWidget

class myQueueTab(QWidget):

    def __init__(self):
        super().__init__()
        layout = QVBoxLayout(self)
        queueQuickWidget = QQuickWidget(QUrl.fromLocalFile("queueTabQml.qml"))
        layout.addWidget(queueQuickWidget)
        self.setLayout(layout)

resultTabQml.qml

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

Item{
    Rectangle{
        id:rect1
        color:"yellow"
        anchors.fill: parent
        Text {
            id: sampleText1
            text: qsTr("sampleText1")
            font.family: "Arial"
            font.pointSize: 50
            anchors.rightMargin: 0
            anchors.bottomMargin: 0
            anchors.fill: parent
            verticalAlignment: Text.AlignVCenter
            horizontalAlignment: Text.AlignHCenter
        }
    }

}
/*##^##
Designer {
    D{i:0;autoSize:true;height:480;width:640}
}
##^##*/

【问题讨论】:

  • 很抱歉,您希望我提供代码以便重现错误吗?如果是这样,我该怎么做?
  • 没错,我需要重现问题所需的所有代码,这样我就可以分析问题出在哪里,并可能给你一个解决方案。我的建议是您制作项目的副本并删除不必要的代码:正则表达式、数据库等,但即使您的代码也是可行的,然后编辑您的问题并添加所有 .qml、.ui 和 .py上述结果。
  • 我已添加 .ui 文件并删除了不必要的代码。看看吧:)

标签: python pyqt qml pyqt5


【解决方案1】:

您必须将ResizeMode 属性设置为SizeRootObjectToView 以便根根据QQuickWidget 的大小进行扩展:

import os

from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QVBoxLayout, QWidget
from PyQt5.QtQuickWidgets import QQuickWidget

CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))


class myResultTab(QWidget):
    def __init__(self):
        super().__init__()
        layout = QVBoxLayout(self)
        filename = os.path.join(CURRENT_DIR, "resultTabQml.qml")
        resultQuickWidget = QQuickWidget(QUrl.fromLocalFile(filename))
        resultQuickWidget.setResizeMode(QQuickWidget.SizeRootObjectToView)
        layout.addWidget(resultQuickWidget)

如果你不设置它,那么 resizeMode 使用默认的SizeViewToRootObject 项目不会考虑视图的大小,因此项目的大小将是 0x0,因此黄色矩形也将是相同的大小, 文本将以 OP 提供的图像中显示的位置 (0, 0) 为中心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    相关资源
    最近更新 更多