(二) SIP混编 基础例子 - 初试python调用QT QLabel

参考文献

1.下载并解压

10769157-3d11b9d0964b60ec.png

image.png

 

修改MyLabel.pro文件

 

10769157-d70b5a73e19de453.png

image.png

把把这一段注释掉 , 这样才会同时生成dll和lib文件。
QT msvc版 release编译后 , 把Release目录拷贝到当前文件夹

10769157-71f42d893debee97.png

编译结果

2.修改configure.py文件

  • dll 和 moc_mylabel.obj 文件稍后会用到
#注释参照上一讲 
from PyQt5.QtCore import PYQT_CONFIGURATION as pyqt_config
from distutils import sysconfig
import os, sipconfig, sys

config = sipconfig.Configuration()
config.platform = "win32-msvc2015"

qt_path = 'C:/Qt/Qt5.9.1/5.9.1/msvc2015_64'
print('QT_DIR: %s' % qt_path)

config.sip_bin ="C:/Users/Win_Lin/AppData/Local/Programs/Python/Python36/sip.exe"
config.default_sip_dir = "C:/Users/Win_Lin/AppData/Local/Programs/Python/Python36/Lib/site-packages/sip"

sip_files_dir=os.path.abspath(os.path.join(".","sip"))
sip_file = os.path.join(sip_files_dir, "PyMyLabel.sip")

inc_dir=os.path.abspath(os.path.join(".","src"))
sip_files_dir=os.path.abspath(os.path.join(".","sip"))
output_dir =os.path.abspath(os.path.join(".", "modules")) #新建文件
build_file="PyMyLabel.sbf"
build_path = os.path.join(output_dir, build_file)
dest_pkg_dir="PyMyLabel"

cmd=" ".join([
    config.sip_bin,
    pyqt_config['sip_flags'],

    '-I', sip_files_dir,
    '-I', config.default_sip_dir,
    '-I', config.sip_inc_dir,
    '-I', inc_dir,
    '-I', config.sip_bin,
    
    "-c", output_dir,
    "-b", build_path,
    "-w",
    "-o",
    sip_file,
])
os.makedirs("modules", exist_ok=True)
print(cmd)
os.system(cmd)

makefile=sipconfig.SIPModuleMakefile(
    config,
    build_file,
    dir=output_dir,
    install_dir=dest_pkg_dir
)

makefile.extra_defines+=['MYLABEL_LIBRARY','QT_CORE_LIB', 'QT_GUI_LIB', 'QT_WIDGETS_LIB']

makefile.extra_include_dirs = [
    '../', '.', 
    os.path.join(qt_path, 'include'),

    os.path.join(qt_path, 'include', 'QtCore'),
    os.path.join(qt_path, 'include', 'QtGui'),
    os.path.join(qt_path, 'include', 'QtWidgets'),
]

makefile.extra_lib_dirs = [
    os.path.join('.', 'Release'),
    os.path.join('.', 'Release','release'),
    os.path.join('..', 'Release'),
    os.path.join('..', '..', 'Release'),
    os.path.join('..', 'Release', 'release'),
    os.path.join('..', '..', 'Release', 'release'),
    os.path.join(qt_path, 'lib'),
]

makefile.extra_libs = [
    'MyLabel',
    'Qt5Core',
    'Qt5Gui',
    'Qt5Widgets',
]

makefile.generate()

3. 构建

运行命令

python configure.py

10769157-98db7d85e532445f.png

进入modules文件夹 , 修改makefile 文件 , 把 moc_mylabel.obj 添加到 OFILES 中 (否则nmake会报LNK2001错误)

 

10769157-97e3e1830a759483.png

image.png

 

将src文件夹下的.h拷贝到modules下

 

10769157-6a3f7db82e33d329.png

image


运行VS2015 X64命令行工具 (参照上一讲 , 很重要!! 否则会出错) , 执行命令

nmake
nmake install

10769157-d59c73241bb1e241.png

image.png

 

将 2. 中的dll复制到...\Python36\Lib\site-packages\文件夹下

5. python测试

#sip_label.py
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyMyLabel import MyLabel

class Widget(QWidget):
    def __init__(self, parent=None, **kwargs):
        super().__init__(parent, **kwargs)
        
        l=QVBoxLayout(self)
        self._myLabel=MyLabel(self)
        l.addWidget(self._myLabel)
        
if __name__=="__main__":
    from sys import argv, exit
    a=QApplication(argv)
    w=Widget()
    w.show()
    w.raise_()
    exit(a.exec_())

测试结果

 

10769157-31a2f192dac8e078.png

image.png


如有错误与疑点,请留言指正。

欢迎同道交流指点

10769157-d3095bcffd91141b.png

QQ群 与 微信公众号

QQ群 : 246269919 ( 已满 )

432987409 (入群先看 本群须知 )

微信公众号:WoHowLearn
( 课件与代码在此 )

简书 : WoHowLearn

GitHub :
https://github.com/892768447
https://github.com/625781186

厚脸皮求关注打赏

PyQt ,可以使用如下方式在子类调用 QT 控件: ```python from PyQt5.QtWidgets import QWidget, QLabel, QVBoxLayout, QApplication class MyWidget(QWidget): def __init__(self): super().__init__() label = QLabel('Hello, World!', self) layout = QVBoxLayout(self) layout.addWidget(label) if __name__ == '__main__': app = QApplication([]) widget = MyWidget() widget.show() app.exec_() ``` 在这个示例,我们定义了一个 MyWidget 类,它继承自 QWidget。在 MyWidget 类的构造函数,我们创建了一个 QLabel 控件,并将其添加到一个 QVBoxLayout 布局。然后,我们将这个布局设置为 MyWidget 的布局。 在主函数,我们创建了一个 MyWidget 对象并显示它。这时,我们就可以在 MyWidget 类的任何方法访问 QLabel 控件,例如: ```python class MyWidget(QWidget): def __init__(self): super().__init__() self.label = QLabel('Hello, World!', self) layout = QVBoxLayout(self) layout.addWidget(self.label) def change_label_text(self, text): self.label.setText(text) ``` 在这个示例,我们将 QLabel 控件存储为 MyWidget 的属性 self.label。然后,我们定义了一个方法 change_label_text,它可以接受一个字符串作为参数,并将其设置为 QLabel 控件的文本。这时,我们就可以在主程序调用 MyWidget 对象的 change_label_text 方法来动态更改 QLabel 控件的文本,例如: ```python if __name__ == '__main__': app = QApplication([]) widget = MyWidget() widget.show() # 更改 QLabel 控件的文本 widget.change_label_text('Hello, PyQt!') app.exec_() ``` 这个例子,我们在主程序调用 MyWidget 对象的 change_label_text 方法来更改 QLabel 控件的文本。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值