国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Qt第十六章:QWidget與QML混合開發(fā)

這篇具有很好參考價(jià)值的文章主要介紹了Qt第十六章:QWidget與QML混合開發(fā)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

一、Qml作為窗口引入

二、Qml作為控件引入(Qml根組件不能是window)

三、兩個(gè)問題①Q(mào)ml文件如何調(diào)用python函數(shù)②python代碼如何控制Qml元素。


一、Qml作為窗口引入

例:QWidget窗口中用按鈕打開和關(guān)閉Qml窗口
①Q(mào)Widget窗口

import sys
from pathlib import Path

from PySide6.QtCore import QObject, Slot
from PySide6.QtQml import QQmlApplicationEngine
from PySide6.QtQuick import QQuickItem
from PySide6.QtWidgets import QApplication, QWidget, QPushButton

class TestWidget(QWidget):
    def __init__(self, parent=None):
        super(TestWidget, self).__init__(parent)
        self.button_open = QPushButton(self)
        self.button_open.setText("打開Qml窗口")
        self.button_open.setGeometry(0, 100, 100, 50)
        self.button_open.clicked.connect(self.handle_button_open_click)
        self.button_close = QPushButton(self)
        self.button_close.setText("關(guān)閉Qml窗口")
        self.button_close.setGeometry(100, 100, 100, 50)
        self.button_close.clicked.connect(self.handle_button_close_click)

    # 打開Qml窗口
    def handle_button_open_click(self):
        self.widget = LoginQuickWidget()

    # 關(guān)閉Qml窗口
    def handle_button_close_click(self):
        if hasattr(self, 'widget') and self.widget:
            del self.widget


if __name__ == '__main__':
    app = QApplication([])
    widget = TestWidget()
    widget.show()
    app.exec()

②Qml窗口

注意:此處是直接引入qml文件。如果是從qrc資源文件中引入qml,則直接QQmlApplicationEngine.load即可
qwidget和qml混合編程,Qt for Python,qt,ui,開發(fā)語言,qt designer,pyside6????????qwidget和qml混合編程,Qt for Python,qt,ui,開發(fā)語言,qt designer,pyside6

# 槽函數(shù)類(一個(gè)承載槽函數(shù)的容器類)
class Slots(QObject):
    def __init__(self, objects):
        self.objects = objects
        super().__init__()

    @Slot(str, result=None)
    def set_text_msg(self, msg):
        # 獲取qml中的Text對(duì)象
        child = self.objects[0].findChild(QQuickItem, "text1")
        # 獲取對(duì)象屬性
        p = child.property("text")
        # 設(shè)置對(duì)象屬性
        child.setProperty("text", p + msg)

    @Slot(result=str)
    def get_text_msg(self):
        return "皎氯"


"""
這種方式是以Qml作為窗口來使用。所有的邏輯UI都由Qml來完成。python提供可以調(diào)用數(shù)據(jù)的API即可。
"""


class LoginQuickWidget:
    def __init__(self):
        # 初始化UI
        self.engine = QQmlApplicationEngine()
        qml_file = Path(__file__).resolve().parent / "login.qml"
        # 加載qml文件
        self.engine.load(qml_file)
        if not self.engine.rootObjects():
            sys.exit(-1)
        # qml對(duì)象集合
        objects = self.engine.rootObjects()
        # 實(shí)例化槽函數(shù)
        self.slots = Slots(objects)
        # 注入槽函數(shù)
        self.engine.rootContext().setContextProperty('slots', self.slots)

③Qml文件文章來源地址http://www.zghlxwxcb.cn/news/detail-562437.html

/**************************QML文件**************************/

import QtQuick
import QtQuick.Window
import QtQuick.Controls 6.3
import QtQuick.Layouts 6.3
import QtQuick.Controls.Windows 6.0

//主窗口
Window {
    width: 800
    height: 400
    visible: true
    title: qsTr("測試窗口")
    Image {
        id:background_image
        anchors.fill: parent
        fillMode: Image.PreserveAspectCrop
        source: "http://cube.elemecdn.com/6/94/4d3ea53c084bad6931a56d5158a48jpeg.jpeg"
        antialiasing: true
    }
    //文本展示框
    Text {
        id: text1
        //用于python獲取此對(duì)象
        objectName:"text1"
        x: 300
        y: 20
        width: 200
        height: 34
        text: qsTr("初始值")
        font.pixelSize: 12
    }

    //一:通過JavaScript控制UI邏輯
    Button {
        id: button
        x: 125
        y: 179
        width: 125
        height: 29
        text: qsTr("調(diào)用JavaScript方法")
        //點(diǎn)擊事件
        onClicked: {
            change()
        }
        //JavaScript函數(shù)
        function change(){
            var date = new Date();
            text1.text=qsTr(date.getFullYear()+"年"+(date.getMonth() + 1)+"月"+date.getDate()+"日"+date.getHours()+"時(shí)"+date.getMinutes()+"分"+date.getSeconds()+"秒")
        }
    }

    //二:通過Python控制UI邏輯(不推薦,因?yàn)橐鯱I與業(yè)務(wù)邏輯分離;槽函數(shù)相當(dāng)于于ajax請(qǐng)求來獲取數(shù)據(jù),而不是去控制UI本身)
    Button {
        id: button1
        x: 325
        y: 179
        width: 125
        height: 29
        text: qsTr("調(diào)用Python設(shè)置屬性")
        //點(diǎn)擊事件
        onClicked: {
            //調(diào)用注入的槽函數(shù),使用槽函數(shù)改變視圖
            slots.set_text_msg("小小改變")
        }
    }

    //三:通過Python獲取數(shù)據(jù),JavaScript渲染UI(推薦方式)
    Button {
        id: button2
        x: 525
        y: 179
        width: 125
        height: 29
        text: qsTr("調(diào)用Python獲取數(shù)據(jù)")
        //點(diǎn)擊事件
        onClicked: {
            //調(diào)用注入的槽函數(shù),使用槽函數(shù)獲取數(shù)據(jù)
            var msg=slots.get_text_msg()
            //利用JS進(jìn)行渲染
            text1.text=qsTr(msg)
        }
    }

}

二、Qml作為控件引入(Qml根組件不能是window)

from PySide6.QtCore import QUrl, Slot, QObject
from PySide6.QtQuick import QQuickItem
from PySide6.QtQuickWidgets import QQuickWidget
from PySide6.QtWidgets import QWidget, QApplication, QVBoxLayout, QPushButton


# 槽函數(shù)類(一個(gè)承載槽函數(shù)的容器類)
class Slots(QObject):
    def __init__(self, obj):
        super(Slots, self).__init__()
        self.obj = obj

    @Slot(str, result=None)
    def set_text_msg(self, msg):
        # 獲取qml中的Text對(duì)象
        child = self.obj.findChild(QQuickItem, "text1")
        # 獲取對(duì)象屬性
        p = child.property("text")
        # 設(shè)置對(duì)象屬性
        child.setProperty("text", p + msg)

    @Slot(result=str)
    def get_text_msg(self):
        return "皎氯"


class TestQWidget(QWidget):

    def __init__(self, parent=None):
        super(TestQWidget, self).__init__(parent)
        self.resize(800, 300)
        # 垂直布局
        self.layout = QVBoxLayout(self)
        # OK按鈕
        self.button = QPushButton("OK")
        self.button.clicked.connect(lambda: print("OK"))
        self.layout.addWidget(self.button)

        # QML控件
        self.qml_widget = QQuickWidget()
        # 設(shè)置縮放模式
        self.qml_widget.setResizeMode(QQuickWidget.ResizeMode.SizeRootObjectToView)
        # 向QML中傳入數(shù)據(jù)(必須在setSource之前傳入)
        self.qml_widget.rootContext().setContextProperty("obj", '張良')
        self.qml_widget.setSource(QUrl("test2.qml"))
        # 獲取QML中的對(duì)象(必須在setSource之后)
        self.root_object: QQuickItem = self.qml_widget.rootObject()
        # 實(shí)例化槽函數(shù)
        self.slots = Slots(self.root_object)
        # 注入槽函數(shù)
        self.qml_widget.rootContext().setContextProperty('slots', self.slots)

        # 獲取對(duì)象
        child: QQuickItem = self.root_object.findChild(QQuickItem, "text1")
        # 獲取對(duì)象屬性
        print(child.property("text"))
        
        # 加入布局
        self.layout.addWidget(self.qml_widget)


if __name__ == '__main__':
    app = QApplication([])
    widget = TestQWidget()
    widget.show()
    app.exec()
import QtQuick
import QtQuick.Window
import QtQuick.Controls 6.3
import QtQuick.Layouts 6.3
import QtQuick.Controls.Windows 6.0


Rectangle {
    id:root
    color: "yellow"
    radius:10
    //背景圖
    Image {
        id:background_image
        anchors.fill: parent
        fillMode: Image.PreserveAspectCrop
        source: "http://cube.elemecdn.com/6/94/4d3ea53c084bad6931a56d5158a48jpeg.jpeg"
        antialiasing: true
    }
    //文本展示框
    Text {
        id: text1
        //用于python獲取此對(duì)象
        objectName:"text1"
        x: 300
        y: 20
        width: 200
        height: 34
        text: qsTr(obj)
        font.pixelSize: 12
    }

    //一:通過JavaScript控制UI邏輯
    Button {
        id: button
        x: 125
        y: 179
        width: 125
        height: 29
        text: qsTr("調(diào)用JavaScript方法")
        //點(diǎn)擊事件
        onClicked: {
            change()
        }
        //JavaScript函數(shù)
        function change(){
            var date = new Date();
            text1.text=qsTr(date.getFullYear()+"年"+(date.getMonth() + 1)+"月"+date.getDate()+"日"+date.getHours()+"時(shí)"+date.getMinutes()+"分"+date.getSeconds()+"秒")
        }
    }

    //二:通過Python控制UI邏輯(不推薦,因?yàn)橐鯱I與業(yè)務(wù)邏輯分離;槽函數(shù)相當(dāng)于于ajax請(qǐng)求來獲取數(shù)據(jù),而不是去控制UI本身)
    Button {
        id: button1
        x: 325
        y: 179
        width: 125
        height: 29
        text: qsTr("調(diào)用Python設(shè)置屬性")
        //點(diǎn)擊事件
        onClicked: {
            //調(diào)用注入的槽函數(shù),使用槽函數(shù)改變視圖
            slots.set_text_msg("小小改變")
        }
    }

    //三:通過Python獲取數(shù)據(jù),JavaScript渲染UI(推薦方式)
    Button {
        id: button2
        x: 525
        y: 179
        width: 125
        height: 29
        text: qsTr("調(diào)用Python獲取數(shù)據(jù)")
        //點(diǎn)擊事件
        onClicked: {
            //調(diào)用注入的槽函數(shù),使用槽函數(shù)獲取數(shù)據(jù)
            var msg=slots.get_text_msg()
            //利用JS進(jìn)行渲染
            text1.text=qsTr(msg)
        }
    }

}

三、3個(gè)問題①Q(mào)ml文件如何調(diào)用python函數(shù)②python代碼如何控制Qml元素。③python如何執(zhí)行Qml中的函數(shù)。

到了這里,關(guān)于Qt第十六章:QWidget與QML混合開發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【QT】QWidget實(shí)現(xiàn)柱狀圖

    【QT】QWidget實(shí)現(xiàn)柱狀圖

    在名為 w_bar20auto1 的 QWidget 實(shí)現(xiàn)柱狀圖

    2024年02月02日
    瀏覽(27)
  • Qt 之 QWidget QLabel

    Qt Creator 以工程項(xiàng)目 的方式對(duì)源碼進(jìn)行管理一個(gè)Qt Creator工程包含不同類型的文件 。 .pro 項(xiàng)目描述文件 .pro.user用戶配置描述文件- .h頭文件 .cpp源文件 .ui界面描述文件 資源文件(圖片,音頻,等) pro 項(xiàng)目描述文件的基本組成 #一注釋起始符 : 以“#”開始,到這一行結(jié)束??旖?/p>

    2024年02月13日
    瀏覽(34)
  • Qt:QWidget設(shè)置半透明背景

    Qt:QWidget設(shè)置半透明背景

    設(shè)置窗體QWidget半透明背景 首先前提條件是設(shè)置: setAttribute(Qt::WA_TranslucentBackground); 方法一:重寫QPaintEvent 方法二:自定義qss樣式 方法三:使用QGraphicsOpacityEffect ,不過這種方法會(huì)影響子控件的透明度 效果參考如下:

    2024年02月15日
    瀏覽(36)
  • Qt QWidget、QDialog、QMainWindow的區(qū)別

    Qt QWidget、QDialog、QMainWindow的區(qū)別

    QWidget QWidget 是Qt框架中最基礎(chǔ)的窗口類,可以理解為用戶界面的最基本單元。QWidget類提供了一個(gè)空白窗口,可以通過繼承該類來創(chuàng)建自定義的窗口類。QWidget類提供了基本的窗口屬性和方法,如大小、位置、標(biāo)題、圖標(biāo)等。 QDialog QDialog 是QWidget類的子類,用于創(chuàng)建對(duì)話框窗口

    2024年02月08日
    瀏覽(22)
  • QWidget:Qt中的基本用戶界面類

    QString類是Qt中非常重要的一個(gè)類,用于表示基本用戶界面構(gòu)件。它是其他用戶界面( Widget )類的基類,例如QMainWindow、QDialog和QPushButton等。在本文中,我們將詳細(xì)介紹QWidget類的功能和應(yīng)用場景。 為了創(chuàng)建QWidget對(duì)象,我們可以使用QWidget的默認(rèn)構(gòu)造函數(shù)或指定其父對(duì)象、名稱和其

    2024年02月09日
    瀏覽(23)
  • 在ARM板上實(shí)現(xiàn)qt虛擬鍵盤 Qwidget實(shí)現(xiàn) 官方虛擬鍵盤、第三方虛擬鍵盤qtvirtualkeyboard //Qwidget最簡單但效果不是最好

    在ARM板上實(shí)現(xiàn)qt虛擬鍵盤 Qwidget實(shí)現(xiàn) 官方虛擬鍵盤、第三方虛擬鍵盤qtvirtualkeyboard //Qwidget最簡單但效果不是最好

    在使用qt的虛擬鍵盤以前,我的開發(fā)板qt環(huán)境中并沒有安裝虛擬鍵盤庫,所以這里還會(huì)順便介紹如何在開發(fā)板上已安裝qt環(huán)境的前提下,繼續(xù)更新qt的組件。 開發(fā)板qt版本:5.15.2 在這里,我默認(rèn)你已經(jīng)有自己動(dòng)手交叉編譯過qt源碼了,否則你將缺少部分細(xì)節(jié)和前置知識(shí)。首先在

    2024年04月09日
    瀏覽(333)
  • 【Qt】用QWidget顯示opencv采集的攝像頭圖像

    【Qt】用QWidget顯示opencv采集的攝像頭圖像

    本案例用QWidget容器重寫paintEvent函數(shù)來顯示OpenCv采集的攝像頭畫面,圖像還可以自適應(yīng)QWidget的大小,還可以檢測相機(jī)斷開失聯(lián)的情況(可能是掉電、線被拔了等待)。在改變窗口大小時(shí)暫停顯示圖像,防止莫名其妙的卡頓奔潰錯(cuò)誤?。@示圖像的方式有很多種,可以用QLabel顯

    2024年02月13日
    瀏覽(43)
  • Qt QWidget 抗鋸齒圓角窗口的一個(gè)實(shí)現(xiàn)方案(支持子控件)

    Qt QWidget 抗鋸齒圓角窗口的一個(gè)實(shí)現(xiàn)方案(支持子控件)

    由于 QWidget::setMask 接口設(shè)置圓角不支持抗鋸齒,所以通常會(huì)使用透明窗口加圓角背景,但圓角背景不能滿足對(duì)子控件的裁剪,子控件與圓角區(qū)域重疊的部分還是能顯示出來。當(dāng)然對(duì)于大多數(shù)窗口,留出足夠的邊距也是可以接受。 對(duì)一些特殊場景,比如QComboBox的列表框,UI設(shè)計(jì)

    2023年04月24日
    瀏覽(39)
  • Qt QWidget 設(shè)置樣式表不生效的兩種解決方案

    Qt QWidget 設(shè)置樣式表不生效的兩種解決方案

    在進(jìn)行Qt開發(fā)的時(shí)候,我們往往會(huì)遇到這樣的場景: ????????使用Qt Designer 設(shè)計(jì)界面,但在Qt Designer里設(shè)置好樣式表,使用快捷鍵 shift + alt + r 進(jìn)行預(yù)覽,樣式都是正常的,但程序運(yùn)行起來,樣式就不生效了。 例如設(shè)計(jì)一個(gè)列表,我們將一條數(shù)據(jù)(一行)設(shè)計(jì)設(shè)計(jì)成一個(gè)類

    2023年04月10日
    瀏覽(34)
  • 【Qt 學(xué)習(xí)筆記】QWidget的windowTitle屬性 | windowIcon屬性 | qrc文件機(jī)制

    【Qt 學(xué)習(xí)筆記】QWidget的windowTitle屬性 | windowIcon屬性 | qrc文件機(jī)制

    博客主頁:Duck Bro 博客主頁 系列專欄:Qt 專欄 關(guān)注博主,后期持續(xù)更新系列文章 如果有錯(cuò)誤感謝請(qǐng)大家批評(píng)指出,及時(shí)修改 感謝大家點(diǎn)贊??收藏?評(píng)論? 文章編號(hào):Qt 學(xué)習(xí)筆記 / 17 1. 簡介 windowTitle屬性是一種在用戶界面中顯示窗口的標(biāo)題的屬性。它可以用來設(shè)置窗口的標(biāo)

    2024年04月15日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包