PySide6开发桌面程序,PySide6入门实战(上)

文章目录

  • 系列文章索引
  • 一、前期准备
    • 1、简介及安装
    • 2、PyCharm PySide6环境搭建
      • (1)基础环境
      • (2)配置QT Designer、PyUIC、PyRCC
      • (3)使用pyside6项目
      • (4)资源文件编写与编译
  • 二、QT常用控件
    • 1、Qt窗口类
    • 2、QLineEdit、QLabel、QPushButton
    • 3、QCheckBox(复选框)及其信号槽
    • 4、QComboBox下拉框
    • 5、QTextEdit、QTextBrowser显示文本
    • 6、QListView、QListWidget
    • 7、QStackedWidget
    • 8、QTabWidget
  • 三、布局
    • 1、概述
    • 2、弹簧控件QSpacerltem
    • 3、布局里常用的函数
    • 4、栅格布局
    • 5、表单布局
    • 6、分裂器布局
    • 7、绝对布局
  • 四、信号槽与事件机制
    • 1、普通槽函数使用
    • 2、鼠标事件
    • 3、键盘事件
    • 4、组合按键事件
    • 5、事件过滤
  • 五、QMainWindow使用介绍
    • 1、简介
    • 2、菜单栏
    • 3、工具栏
    • 4、状态栏
    • 5、QDockWidget

系列文章索引

PySide6开发桌面程序,PySide6入门实战(上)
PySide6开发桌面程序,PySide6入门实战(下)

一、前期准备

1、简介及安装

(1)为什么用PySide而不是PyQt
PyQt是由 Riverbank Computing 公司开发,出现的比较早;它采用GPLV3许可证和商业许可证;这表示你如果使用PyOt,则必须将你的代码进行开源;如果要闭源,则需要购买商业许可。
https://riverbankcomputing.com/software/pyqt/intro

PySide是 Ot 官方开源的Python Qt库,出现的时间要比PyOt晚的多,这也是很多人知道PyOt不知道PySide的原因;但随着版本的选代,PvSide越来越强大,目前最新的是PvSide6,建议直接学PvSide6。https://doc.qt.io/qtforpython-6/

(2)QT开发常见技术栈
C++ QWidget;
C++ QML;
Qt5、Qt6;
PyQt5、PyQt6;
PySide2、PySide6;
Python QML。

(3)安装pyside6

pip install pyside6 -i https://mirror.baidu.com/pypi/simple

2、PyCharm PySide6环境搭建

(1)基础环境

win10/win11 64位,安装python环境(可以用Anaconda),安装PyCharm。

(2)配置QT Designer、PyUIC、PyRCC

1、安装好PySide6之后,会下载这些:
在这里插入图片描述
2、配置PySide6_designer:(Qt设计器,可以往窗口上拖控件,设置布局,快速构建窗口,文件后缀.ui)
Program:C:\Users\Admin\.conda\envs\pyside6\Scripts\pyside6-designer.exe
Arguments不需要 填。
Working directory:$ProjectFileDir$
在这里插入图片描述
3、配置PySide6_uic(将.ui文件编译为python代码)
Program:C:\Users\Admin\.conda\envs\pyside6\Scripts\pyside6-uic.exe
Arguments:$FileName$ -o $FileNameWithoutExtension$.py
Working directory:$ProjectFileDir$
在这里插入图片描述

4、配置PySide6_rcc(将资源文件.qrc编译为python代码)
Program:C:\Users\Admin\.conda\envs\pyside6\Scripts\pyside6-rcc.exe
Arguments:$FileName$ -o $FileNameWithoutExtension$.py
Working directory:$ProjectFileDir$
在这里插入图片描述

5、此时,右键项目,就会有这几个工具了:
在这里插入图片描述
运行之后,返回码是0就说明成功。

(3)使用pyside6项目

1、右键项目,选择我们安装的Designer,就可以拖动组件,创建一个ui布局了,保存之后,会保存在项目根路径。
这是一个xml文件,双击可以再次打开。
在这里插入图片描述
在这里插入图片描述
2、右键ui文件,生成python代码
在这里插入图片描述
在这里插入图片描述
3、编写MainWindowImpl.py继承主窗口

import LoginWindow# 定义一个子类,自定义逻辑可以写在子类
class MainWindowImpl(LoginWindow.Ui_MainWindow):def __init__(self, window):super().__init__()self.setupUi(window)# 可以写自定义逻辑#self.lineEdit.setText("user")

4、编写主类

import sys
from PySide6.QtWidgets import QApplication, QMainWindow
import MainWindowImplif __name__ == '__main__':app = QApplication(sys.argv)mw = QMainWindow()impl = MainWindowImpl.MainWindowImpl(mw)mw.show()sys.exit(app.exec())  # 进入QT事件循环# 也可以不用子类,直接这样写,但是自定义逻辑不太好写,每次修改ui会覆盖代码
# if __name__ == '__main__':
#     app = QApplication(sys.argv)
# 
#     mw = QMainWindow()
#     mwReal = MainWindow.Ui_MainWindow()
#     mwReal.setupUi(mw)
#     mw.show()
# 
#     sys.exit(app.exec())  # 进入QT事件循环

(4)资源文件编写与编译

1、右键,new file :Resources.qrc
同时添加上资源文件。

<!DOCTYPE RCC>
<RCC version="1.0"><qresource><file alias="logo">./Resources/test.jpg</file></qresource>
</RCC>

2、qrc文件右键,进行rcc编译
在这里插入图片描述
3、使用图片资源

import sys
from PySide6.QtGui import QIcon
from PySide6.QtWidgets import QApplication, QMainWindow
import MainWindowImpl
# 引入资源!!一定要做的
import Resourcesif __name__ == '__main__':app = QApplication(sys.argv)# 使用资源,使用别名app.setWindowIcon(QIcon(':logo'))mw = QMainWindow()impl = MainWindowImpl.MainWindowImpl(mw)mw.show()sys.exit(app.exec())  # 进入QT事件循环

在这里插入图片描述

二、QT常用控件

1、Qt窗口类

Qt包含三个窗口类:QMainWindow、QWidget、QDialog
在这里插入图片描述
其中,MainWindow,是包含标题栏、菜单栏更加丰富的窗口。

2、QLineEdit、QLabel、QPushButton

(1)ui布局
另存为CalcMainWindow.ui,并使用uic生成python文件。
在这里插入图片描述
(2)编写子类
可以给按钮添加点击事件。
添加子类的目的是,防止每次编辑了ui,自己的代码被覆盖了。

from PySide6.QtWidgets import QMessageBox
import CalcMainWindowclass CalcMainWindowImpl(CalcMainWindow.Ui_MainWindow):def __init__(self, window):super().__init__()self.setupUi(window)# pushButton的点击事件,这是那个按钮的objectNameself.pushButton.clicked.connect(self.onCalc)# 槽函数def onCalc(self):# 获取第一个和第二个输入框的内容,获取的时候是字符串,需要转换str1 = self.lineEdit1.text().strip()str2 = self.lineEdit2.text().strip()if len(str1) == 0 or len(str2) == 0:QMessageBox.warning(None, 'Warning', '请输入两个加数')returnnum1 = float(str1)num2 = float(str2)result = num1 + num2self.lineEdit3.setText(str(result))

(3)主类

import sys
from PySide6.QtWidgets import QApplication, QMainWindowimport CalcMainWindowImplif __name__ == '__main__':app = QApplication(sys.argv)mw = QMainWindow()impl = CalcMainWindowImpl.CalcMainWindowImpl(mw)mw.show()sys.exit(app.exec())  # 进入QT事件循环

(4)运行结果
在这里插入图片描述

3、QCheckBox(复选框)及其信号槽

(1)ui
ui保存命名为MainWindow
在这里插入图片描述
(2)编写子类

import MainWindowclass MainWindowImpl(MainWindow.Ui_MainWindow):def __init__(self, window):super().__init__()self.setupUi(window)# checkBox状态改变事件的监听self.checkBox1.stateChanged.connect(self.onCheckBox1StateChanged)def onCheckBox1StateChanged(self, state):# 没选中是0,选中后是2if state == 0:print("Checked")if state == 2:print("Un Checked")

4、QComboBox下拉框

(1)ui
在这里插入图片描述
(2)编写子类

import MainWindowclass MainWindowImpl(MainWindow.Ui_MainWindow):def __init__(self, window):super().__init__()self.setupUi(window)# 设置下拉值self.comboBox.addItem("Option 0")self.comboBox.addItem("Option 1")self.comboBox.addItem("Option 2")self.comboBox.addItem("Option 3")# 默认选项self.comboBox.setCurrentIndex(2)# 设置信号槽 索引改变事件监听,选项变化时会调用self.comboBox.currentIndexChanged.connect(self.comboBoxCurrentIndexChanged)# 用户一个选项发出时,参数是所选项的索引,还有个重载版本,str类型的,参数是文本self.comboBox.activated.connect(self.comboBoxActivated)def comboBoxCurrentIndexChanged(self, index):print('comboBoxCurrentIndexChanged切换到了' + str(index))def comboBoxActivated(self, index):print('comboBoxActivated切换到了' + str(index))

(3)QComboBox的信号
QComboBox常用的信号包括:
activated(int):当用户选择一个项时发出,参数是所选项的索引。
activated(str):重载版本,当用户选择一个项时发出,参数是所选项的文本。
currentlndexChanged(int):当下拉列表的当前项改变时发出,参数是新的当前项的索引。
currentTextChanged(str):当下拉列表的当前项文本改变时发出,参数是新的当前项的文本。
highlighted(int):当用户在下拉列表中高亮一个项时发出,参数是高亮项的索引。

5、QTextEdit、QTextBrowser显示文本

(1)两者区别
QTextBrowser 继承自 QTextEdit,具有所有 QTextEdit 的功能,并添加了一些额外的功能,特别是用于显示超链接和导航功能的能力,类似于一个简易的网页浏览器。QTextBrowser 可以显示静态的HTML文档,并支持超链接互动。这使得 QTextBrowser 非常适合用作显示只读的、格式化的文本内容,比如帮助文档。

用途:QTextEdit 更适合用于文本编辑,而 QTextBrowser 更适合用于显示格式化的只读文本
导航功能:QTextBrowser支持链接导航,可以处理内部的超链接事件。
只读属性:QTextBrowser 默认是只读的,而 QTextEdit 默认是可编辑的。

总的来说,如果你需要让用户编辑文本,那么 QTextEdit 是更好的选择。而如果你需要展示带有超链接的只读文本,QTextBrowser是更合适的选择。

(2)ui
在这里插入图片描述
在这里插入图片描述
(3)编写子类

import MainWindowclass MainWindowImpl(MainWindow.Ui_MainWindow):def __init__(self, window):super().__init__()self.setupUi(window)# 给textEdit设置文本self.textEdit.setText("123456")# textEdit文本变更事件self.textEdit.textChanged.connect(self.onTextChanged)# 给textBrowser设置HTML内容self.textBrowser.setHtml("""<h1>Hello World</h1><p>link to <a href="https://www.python.org">Python website</a></p>""")self.textBrowser.setText("""<h1>Hello World</h1><p>link to <a href="https://www.python.org">Python website</a></p>""")# 设置可以打开超链接self.textBrowser.setOpenExternalLinks(True)def onTextChanged(self):# 获取里面的文本print(self.textEdit.toPlainText())

6、QListView、QListWidget

(1)两者区别
QListWidget是一个更高级的控件,提供了接口来添加、删除和管理列表项。
不需要单独设置数据模型(Model),因为QListWidget内部就是一个简单的数据模型。对于简单的列表需求,比如只需展示文本列表项,QListWidget可能是更简单直接的选择。

QListView属于Model/View框架,是一个更灵活、更低级的控件,它需要与一个数据模型(Model)配合使用。
QListView仅仅是一个视图组件,它不存储任何数据,所有的数据都存储在它所连接的模型中。这意味着你需要创建或使用一个数据模型(如QStandardltemModel、自定义模型等),并将其设置给QListView来显示数据。由于是基于模型/视图的,QListView可以用来展示更复杂的数据结构,提供了更高的自定义性和灵活性。你可以控制数据的表示、存储和行为。

如果需求相对简单,比如只需要显示一个文本列表,并对列表项进行一些基本操作,那么QListWidget可能是更简单的选择。
但如果你需要更高的灵活性和定制性,比如显示复杂的数据结构或者需要自定义数据的展示方式,那么使用QListView配合一个合适的数据模型会是更好的选择,也就是说QListView更适合用于需要高度定制或展示复杂数据的场景。
(2)ui
在这里插入图片描述
(3)子类

from PySide6.QtCore import QStringListModel
from PySide6.QtWidgets import QListWidgetItemimport MainWindow
from CustomListItem import CustomListItemclass MainWindowImpl(MainWindow.Ui_MainWindow):def __init__(self, window):super().__init__()self.setupUi(window)# QListWidgetfirstItem = CustomListItem()item = QListWidgetItem(self.listWidget)item.setSizeHint(firstItem.sizeHint())# 可以设置自定义的QWidgetself.listWidget.setItemWidget(item, firstItem)# 添加列表项for i in range(10):item = QListWidgetItem(f'item0{i}')self.listWidget.addItem(item)# QListViewmodel = QStringListModel(['itemstr1', 'itemstr2', 'itemstr3', 'itemstr4'])self.listView.setModel(model)

(4)自定义的QWidget

from PySide6.QtWidgets import QWidget, QHBoxLayout, QLabel, QVBoxLayout, QCheckBox, QPushButton, QMessageBox# 自定义QWidget
class CustomListItem(QWidget):def __init__(self):super().__init__()self.setFixedSize(100, 50)main_hLay = QHBoxLayout()leftLabel = QLabel()leftLabel.setFixedSize(50, 50)leftLabel.setText('A')main_hLay.addWidget(leftLabel)vLay = QVBoxLayout()ck = QCheckBox()ck.setText('开启')ck.setFixedSize(50, 20)btn = QPushButton()btn.setFixedSize(50, 25)btn.setText('智能润色')vLay.addWidget(ck)vLay.addWidget(btn)main_hLay.addLayout(vLay)self.setLayout(main_hLay)btn.clicked.connect(self.onBtnRunse)def onBtnRunse(self):QMessageBox.information(None, '提示', '智能润色')

(5)运行效果
在这里插入图片描述

7、QStackedWidget

(1)ui
两个ui,其中Widget是QStackedWidget的一个页面。
QStackedWidget默认会创建出两个页面,需要我们删除。
在这里插入图片描述
在这里插入图片描述
(2)子页面

import MainWindow
import MyWidget
import Pages# 自定义Widget
class MyWidgetImpl(MyWidget.Ui_Form):def __init__(self, Widget):super().__init__()self.setupUi(Widget)
from PySide6.QtWidgets import QWidget, QHBoxLayout, QLabel, QLineEditclass Page1(QWidget):def __init__(self):super().__init__()hLay = QHBoxLayout()label = QLabel()label.setText('page1')hLay.addWidget(label)lineEdit = QLineEdit()lineEdit.setText('这是第一个页面')hLay.addWidget(lineEdit)self.setLayout(hLay)class Page2(QWidget):def __init__(self):super().__init__()hLay = QHBoxLayout()label = QLabel()label.setText('page2')hLay.addWidget(label)self.setLayout(hLay)

(3)编写子类

from PySide6.QtWidgets import QWidgetimport MainWindow
import MyWidgetImpl
import Pagesclass MainWindowImpl(MainWindow.Ui_MainWindow):def __init__(self, window):super().__init__()self.setupUi(window)# 将自定义的QWidget添加到stackedWidgetpage1 = Pages.Page1()page2 = Pages.Page2()page3 = QWidget()MyWidgetImpl.MyWidgetImpl(page3)self.stackedWidget.addWidget(page1)self.stackedWidget.addWidget(page2)self.stackedWidget.addWidget(page3)# ComBobox添加东西,随着下拉框可以切换页面self.comboBox.addItems(['Page1', 'Page2', 'Page3'])self.comboBox.currentIndexChanged.connect(self.onComboBoxIndexChanged)def onComboBoxIndexChanged(self, index):self.stackedWidget.setCurrentIndex(index)

(4)效果
在这里插入图片描述

8、QTabWidget

QTabWidget提供了一个选项卡式的界面,允许用户在不同的页面(tab)之间切换。每个页面都是一个独立的小部件,可以包含各种界面元素。

(1)ui
在这里插入图片描述
(2)子页面

from PySide6.QtWidgets import QWidget, QHBoxLayout, QLabelclass Tab1(QWidget):def __init__(self):super().__init__()hLay = QHBoxLayout()label = QLabel()label.setText('tab1')hLay.addWidget(label)self.setLayout(hLay)class Tab2(QWidget):def __init__(self):super().__init__()hLay = QHBoxLayout()label = QLabel()label.setText('tab2')hLay.addWidget(label)self.setLayout(hLay)class Tab3(QWidget):def __init__(self):super().__init__()hLay = QHBoxLayout()label = QLabel()label.setText('tab3')hLay.addWidget(label)self.setLayout(hLay)

(3)编写子类

import MainWindow
import TabWidgetclass MainWindowImpl(MainWindow.Ui_MainWindow):def __init__(self, window):super().__init__()self.setupUi(window)tab1 = TabWidget.Tab1()tab2 = TabWidget.Tab2()tab3 = TabWidget.Tab3()# 添加页面,位置、Widget、名称self.tabWidget.insertTab(0, tab1, 'tab01')self.tabWidget.insertTab(1, tab2, 'tab02')self.tabWidget.insertTab(2, tab3, 'tab03')

三、布局

1、概述

各种布局可以多尝试,很多复杂的设计,都是由一个个的Widget整合在一起的。

就像是html的一个个div等控件一样,设置位置。
在这里插入图片描述

2、弹簧控件QSpacerltem

添加弹簧控件通常指的是在布局中添加一个可伸缩的空白区域,以便控件可以按照需要展开或收缩。
这通常是用于在控件之间添加空间,或者将控件推向布局的边缘。

spacer = QSpacerltem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
layout.addSpacerltem(spacer)
'''
在上面的例子中,QSpacerltem的构造函数接收四个参数:
1.宽度(40)
2.高度(20)
3.宽度策略(OSizePolicy.Expanding)这意味着弹簧控件可以扩展,以填充布局中的任何额外空间。
4.高度策略OSizePolicy.Minimum):这意味着弹簧控件的高度保持最小值不会扩展。通过将OSpacerltem添加到布局中,Button1和Button2会被推到窗口的两侧
'''

在这里插入图片描述

3、布局里常用的函数

addWidget(widget,stretch=0):将小部件添加到布局中。stretch参数用于指定小部件拉伸的比例。
addLayout(layout,stretch=0):将另一个布局嵌套到当前布局中。这允许创建复杂的布局结构。
setSpacing(spacing):设置布局中小部件之间的间距。
setMargin(margin):设置布局边缘与其容器边缘之间的距离。在最新版本的Qt中,可能需要使用setContentsMargins()来替代此功能。
setAlignment(widget,alignment):设置小部件相对于其分配空间的对齐方式例如,Qt.AlignCenter、Qt.AlignLeft等。

4、栅格布局

在这里插入图片描述

5、表单布局

QFormLayout设计上主要用于单列布局,每一行通常包含一个标签和一个字段(或者两个相关的窗口小部件),因此它自然支持多行但本质上是单列的布局。对于需要多行多列布局的情况,则需要使用QGridLayout。
在这里插入图片描述

6、分裂器布局

分裂器布局,两个组件之间是可以拖动的
在这里插入图片描述

7、绝对布局

move(x, y)
对于一些位置固定的控件,需要使用绝对布局,直接根据坐标写位置。
如果有蓝湖设计图,绝对布局很轻松。

在这里插入图片描述

四、信号槽与事件机制

1、普通槽函数使用

from PySide6.QtWidgets import QMessageBox
import MainWindowclass MainWindowImpl(MainWindow.Ui_MainWindow):def __init__(self, window):super().__init__()self.setupUi(window)# 槽函数,绑定鼠标点击按钮事件self.pushButton.clicked.connect(self.onPushButtonClicked)def onPushButtonClicked(self):QMessageBox.information(None, "Hello", "Hello World")

2、鼠标事件

from PySide6.QtCore import Qtimport MainWindowclass MainWindowImpl(MainWindow.Ui_MainWindow):def __init__(self, window):super().__init__()self.setupUi(window)window.setMouseTracking(True)  # 开启鼠标追踪# 事件 ,注意,事件是在QWidget中的window.mousePressEvent = self.mousePressEventwindow.mouseReleaseEvent = self.mouseReleaseEventwindow.mouseMoveEvent = self.mouseMoveEventwindow.wheelEvent = self.wheelEventwindow.mouseDoubleClickEvent = self.mouseDoubleClickEventdef mousePressEvent(self, event):if event.button() == Qt.LeftButton:print("左键")elif event.button() == Qt.RightButton:print("右键")elif event.button() == Qt.MiddleButton:print("中键")def mouseReleaseEvent(self, event):if event.button() == Qt.LeftButton:print("左键释放")elif event.button() == Qt.RightButton:print("右键释放")elif event.button() == Qt.MiddleButton:print("中键释放")def mouseDoubleClickEvent(self, event):if event.button() == Qt.LeftButton:print("左键双击")elif event.button() == Qt.RightButton:print("右键双击")elif event.button() == Qt.MiddleButton:print("中键双击")def mouseMoveEvent(self, event):print("鼠标移动")print("x:", event.x(), "y:", event.y())def wheelEvent(self, event):print("鼠标滚轮")print("滚动值:", event.angleDelta().y())y = event.angleDelta().y()# mac和windows的滚动方向相反  y > 0 向上滚动  y < 0 向下滚动if y > 0:print(f"y = {y}")print("向上滚动")else:print(f"y = {y}")print("向下滚动")

3、键盘事件

from PySide6.QtCore import Qtimport MainWindowclass MainWindowImpl(MainWindow.Ui_MainWindow):def __init__(self, window):super().__init__()self.setupUi(window)window.keyPressEvent = self.keyPressEventwindow.keyReleaseEvent = self.keyReleaseEventdef keyPressEvent(self, event):key = event.key()print(f"按下了键盘键:{event.text()}")if key == Qt.Key_Escape:print(f"按下了键盘esc键:{event.text()}")elif key == Qt.Key_Enter or key == Qt.Key_Return:print(f"按下了键盘回车键:{event.text()}")def keyReleaseEvent(self, event):print(f"释放了键盘键:{event.text()}")

4、组合按键事件

from PySide6.QtCore import Qtimport MainWindowclass MainWindowImpl(MainWindow.Ui_MainWindow):def __init__(self, window):super().__init__()self.setupUi(window)window.mousePressEvent = self.mousePressEventwindow.mouseReleaseEvent = self.mouseReleaseEventwindow.keyPressEvent = self.keyPressEventwindow.keyReleaseEvent = self.keyReleaseEventdef mousePressEvent(self, event):if event.modifiers() & Qt.ControlModifier:if event.button() == Qt.LeftButton:print('ctrl +鼠标左键')def mouseReleaseEvent(self, event):print('按键已弹起')def keyPressEvent(self, event):key = event.key()if event.modifiers() & Qt.ControlModifier:if key == Qt.Key_S:print('ctrl + S')def keyReleaseEvent(self, event):print('按键已弹起')

5、事件过滤

from PySide6.QtCore import Qt, QEvent
from PySide6.QtWidgets import QLineEdit, QVBoxLayoutimport MainWindowclass MainWindowImpl(MainWindow.Ui_MainWindow):def __init__(self, window):super().__init__()self.setupUi(window)# lineEdit添加过滤器self.lineEdit.installEventFilter(window)window.eventFilter = self.eventFilterdef eventFilter(self, watched, event):if event.type() == QEvent.KeyPress:# 空格、enter等不允许输入if event.key() in (Qt.Key_Backspace, Qt.Key_Enter, Qt.Key_Return, Qt.Key_Delete):return False# 数字不允许输入if event.text().isdigit():return Falsereturn Truereturn False

在这里插入图片描述

五、QMainWindow使用介绍

1、简介

QMainWindow包含菜单栏、工具栏、状态栏等。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、菜单栏

注意,使用QT设计器,菜单栏的子菜单是无法直接输入中文的,需要粘贴进去
在这里插入图片描述

import MainWindow
import Resources # 资源!class MainWindowImpl(MainWindow.Ui_MainWindow):def __init__(self, window):super().__init__()self.setupUi(window)# 注意,图标貌似只能选一些内置的,想要自定义图片,需要手动设置self.action.setIcon(QIcon(':test'))# 菜单信号,点击事件self.action.triggered.connect(self.actionTriggered)def actionTriggered(self):print('点击了')

3、工具栏

工具栏需要手动添加:
在这里插入图片描述
在这里插入图片描述

from PySide6.QtGui import QIconimport MainWindow
import Resourcesclass MainWindowImpl(MainWindow.Ui_MainWindow):def __init__(self, window):super().__init__()self.setupUi(window)# 注意,图标貌似只能选一些内置的,想要自定义图片,需要手动设置self.action.setIcon(QIcon(':t1'))# 工具栏信号,点击事件self.action.triggered.connect(self.actionTriggered)def actionTriggered(self):print('点击了')

4、状态栏

import MainWindow
import Resourcesclass MainWindowImpl(MainWindow.Ui_MainWindow):def __init__(self, window):super().__init__()self.setupUi(window)# 状态栏,设置文字self.statusbar.showMessage('初始状态')

5、QDockWidget

使用 addDockwidget()将停靠窗口添加到主窗口的不同区域(例如左侧、顶部、底部或者右侧)。
QDockWidget 可以通过用户操作在停靠状态和浮动状态之间切换

#创建停靠窗口
dock = QDockWidget("Dockable",self)
self.addDockWidget(Qt.RightDockWidgetArea, dock)

注意:dockwidget只能在QMainWindow里使用,QWidget、QDialog不行
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/41781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

排序矩阵查找

题目链接 排序矩阵查找 题目描述 注意点 每一行、每一列都按升序排列 解答思路 可以从右上角开始遍历&#xff0c;如果当前元素就等于target&#xff0c;直接返回true&#xff1b;如果当前元素小于target&#xff0c;则target肯定在当前位置下方&#xff1b;如果当前元素大…

挑战杯 LSTM的预测算法 - 股票预测 天气预测 房价预测

0 简介 今天学长向大家介绍LSTM基础 基于LSTM的预测算法 - 股票预测 天气预测 房价预测 这是一个较为新颖的竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/postgraduate 1 基于 Ke…

手机飞行模式是什么意思?3个方法教你如何开启

在现代生活中&#xff0c;手机已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;有时我们需要暂时切断手机的通信功能&#xff0c;比如在飞机上、开会时或需要安静休息的时候。这时候&#xff0c;苹果手机上的“飞行模式”功能就派上了用场。 那么&#xff0c;手机飞…

人脸表情识别Facial Expression Recognition基于Python3和Keras2(TensorFlow后端)

人脸表情识别项目是一个结合了计算机视觉和深度学习技术的高级应用&#xff0c;主要用于分析和理解人类面部表情所传达的情感状态。这样的系统可以用于多种场景&#xff0c;比如情绪分析、用户交互、市场调研、医疗诊断以及人机接口等领域。 一个典型的人脸表情识别项目可以分…

端到端自动驾驶新突破:Nvidia提出全并行PARA-Drive,斩获CVPR挑战赛冠军

论文标题&#xff1a; PARA-Drive: Parallelized Architecture for Real-time Autonomous Driving 论文作者&#xff1a; Xinshuo Weng, Boris Ivanovic, Yan Wang, Yue Wang, Marco Pavone 导读&#xff1a; 本文系统分析了自动驾驶高级架构的设计空间&#xff0c;提出了关…

提升内容分享类营销效果的秘籍大公开

今天有丰富实战经验的“蚓链数字化营销平台”来给大家分享一些能有效提高内容分享类数字化营销方案中用户的参与度和转化率的方法。 创造有价值且引人入胜的内容 一定要让分享的内容实用、有趣或者独特&#xff0c;满足大家的需求和兴趣。多运用生动的故事、案例和数据来支持观…

深入分析 Android BroadcastReceiver (十)(完)

文章目录 深入分析 Android BroadcastReceiver (十)1. 深入理解 Android 广播机制的高级应用与实践1.1 高级应用1.1.1 示例&#xff1a;广播启动服务1.1.2 示例&#xff1a;数据变化通知1.1.3 示例&#xff1a;下载完成通知 1.2 实践建议1.2.1 设置权限1.2.2 动态注册和注销广播…

探索企业信用巅峰:3A企业认证的魅力与价值

在现代商业环境中&#xff0c;企业的信用和信誉是其发展的核心要素之一。3A企业认证作为信用评级的最高等级&#xff0c;正在吸引越来越多企业的关注。究竟什么是3A企业认证&#xff1f;它为什么对企业如此重要&#xff1f;本文将深入探讨3A企业认证的独特魅力和巨大价值。 3A企…

0Day漏洞防御篇:GeoServer CVE-2024-36401远程代码执行漏洞

GeoServer是一个用Java编写的开源软件服务器&#xff0c;允许用户共享和编辑地理空间数据。它为提供交互操作性而设计&#xff0c;使用开放标准发布来自任何主要空间数据源的数据。GeoServer存在远程代码执行漏洞&#xff08;CVE-2024-36401&#xff09;&#xff0c;未经身份认…

Aigtek高压放大器指标有哪些要求和标准

高压放大器是一类关键的电子设备&#xff0c;用于放大电信号并提供强大的输出。在不同的应用领域&#xff0c;高压放大器可能有不同的要求和标准。以下是一些常见的高压放大器指标要求和标准&#xff0c;以确保其性能和可靠性&#xff1a; 1.幅度增益和频率响应 高压放大器的主…

人大金仓携手中国一汽引领国产数据库行业新浪潮

在国产化政策的推动下,人大金仓携手中国一汽联合开发更贴近汽车产业特定需求的数据库功能和组件。从2023年2月至今,人大金仓已累计部署690套数据库,适配应用系统170个,支撑中国一汽20多个核心系统和重要系统。目前,中国一汽在国内企业数据库国产化替换率遥遥领先。此次合作为国…

猫咪健康新选择!福派斯鲜肉猫粮里的果蔬纤维大揭秘

你们是不是对福派斯鲜肉猫粮中那些丰富的果蔬粗纤维特别好奇呢&#xff1f;&#x1f914; 其实&#xff0c;这些看似简单的粗纤维&#xff0c;对猫咪的健康可是大有裨益的&#xff01; 粗纤维在猫粮中起到多种重要作用&#xff0c;并且对猫咪的健康和消化系统有着显著的影响。以…

乡村振兴指数与其30个原始变量数据(Shp/Dta/Excel格式,2000-2022年)

数据简介&#xff1a;这份数据是我国各地级市乡村振兴指数与其30各原始变量数据并对其进行地图可视化表达。城镇化是当今中国社会经济发展的必由之路。当前我国城镇化处于发展的关键时期&#xff0c;但城镇化发展的加快却是一把双刃剑&#xff0c;为何要如此形容呢?因为当前城…

职升网:一级注册计量师就业方向如何?

首先我们要知道&#xff0c;一级注册计量师可以聘为工程师&#xff0c;可以负责计量基准和标准的量值传递工作。它可以从事一下7个方面的工作&#xff1a; 1.负责制定计量管理制度、工作计划、并组织实施&#xff1b; 2.建设期参与设计工程等计量方面的工作&#xff0c;编制计…

红黑树模拟实现

目录 概念 性质 节点定义 红黑树的插入 完整代码 概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条…

充电桩开源平台,开发流程有图有工具

慧哥充电桩开源平台产品研发流程是确保产品从概念阶段到市场推广阶段的有序进行的关键。以下是对您给出的步骤的详细解释和建议&#xff1a; 设计业务流程: 在这一步&#xff0c;团队需要确定产品的核心功能、目标用户以及如何满足用户需求。进行市场调研&#xff0c;了解竞争…

PostMan Error:Maximum response size reached

一、问题描述 用postman本地测试&#xff0c;restful api接口导出文件&#xff0c;文件大小为190M&#xff0c;服务没问题&#xff0c;总是在导出时&#xff0c;抛出&#xff1a;Error:Maximum response size reached。开始以为是服务相应文件过大或者相应时间超时导致的。其实…

双向链表 -- 详细理解和实现

欢迎光顾我的homepage 前言 双向链表是一种带头双向循环的链表。在双向链表中&#xff0c;首先存在着一个头结点&#xff1b;其次每个节点有指向下一个节点的指针next 和指向上一个节点的指针prev &#xff1b…

Trimble realworks 2024.02 中文激活版获取License下载软件

Trimble realworks 2024 是领先的3D点云和2D图像处理解决方案&#xff0c;使用可您提供了一组用于处理的工具&#xff0c;以便为您的应用程序&#xff08;或项目&#xff09;获取必要的信息。此处理可以分为三种模式&#xff0c;在注册中&#xff0c;您可以注册相对于其他扫描和…

通信协议_Modbus协议简介

概念介绍 Modbus协议&#xff1a;一种串行通信协议&#xff0c;是Modicon公司&#xff08;现在的施耐德电气Schneider Electric&#xff09;于1979年为使用可编程逻辑控制器&#xff08;PLC&#xff09;通信而发表。Modbus已经成为工业领域通信协议的业界标准&#xff08;De f…