当前位置:   article > 正文

PyQt5从入门到精通系列02-布局(数据展示GUI小项目)_pyqt从入门到精通

pyqt从入门到精通

围棋讲究布局,房屋建筑讲究布局,布局是设计环节的一个重要组成部分,一个优秀的布局会让你的界面设计更具吸引力。在GUI设计布局时,需要考虑各种因素,其中元素的位置、分布占据重要角色。在QtDesinger中,有如下表所示几种布局。在设计时可以先拖拽布局方式至窗体当中再往布局中摆放控件,亦可以先在窗体中设计好控件再点击菜单栏布局方式或选中要布局的一些控件-右键-布局-布局方式。

布局方式描述
水平布局将控件水平排列于窗体或容器类组件中
垂直布局将控件处置排列于窗体或容器类组件中
栅格布局以行和列排列的单元格内放置控件
表单布局用于创建两列表单,一般包含标签及输入
分裂器左右或上下分割,用于自由改变大小的组件之间

上一期,我们讲述了PyQt5安装配置【2023 GUI设计如何学-PyQt5从入门到精通系列01-pycharm配置安装】。本次,我们将开启一个小项目练练手,基本功能是:单机打开文件,在QTableWidget里面展示数据;选择绘图类型,绘图展示,基本效果如下图所示。

控件及布局

QtDesigner可化设计师为我们快速实现GUI设计。在此项目中,主要设计QFrame(一个基类,容器类控件,主要用来容纳一些控件并控制一些边框样式)、QGroupBox(个人最常用容器类控件)、QTableWidget(容器类控件,表格控件,用于表格设计或输出)及其布局(采用了水平布局、垂直布局、水平分裂器)

QAction设计

QAction类提供了抽象的用户界面Action,而这些Action可以被添加到菜单和工具栏中,并且可以自动保持在菜单和工具栏中的同步。QAction可以包括一个图标、菜单文本、快捷键、状态文本等。QAction被创建后拖拽到工具栏上,然后链接到实现相应action功能的槽函数上。

属性参数描述
文本(Text)Action的显示文字
对象名称(Object Name)Action名称
ToolTip鼠标停留时显示的文字
Icon设置Action的图标
Checkable是否可以复选
Shortcut设置快捷键

部分代码展示

  1. import sys
  2. import qdarkstyle
  3. from PyQt5 import QtCore, QtGui, QtWidgets, sip
  4. from PyQt5.QtCore import Qt
  5. from PyQt5.QtGui import QFont
  6. from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QTreeWidgetItem, QTableWidgetItem, QMessageBox, \
  7. QFileDialog
  8. import PlotWidgets
  9. class Ui_MainWindow(QMainWindow):
  10. def __init__(self):
  11. super(Ui_MainWindow, self).__init__()
  12. self.setupUi(self)
  13. def setupUi(self, MainWindow):
  14. MainWindow.setObjectName("MainWindow")
  15. MainWindow.resize(773, 747)
  16. self.centralwidget = QtWidgets.QWidget(MainWindow)
  17. self.centralwidget.setObjectName("centralwidget")
  18. self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
  19. self.horizontalLayout.setObjectName("horizontalLayout")
  20. self.frame = QtWidgets.QFrame(self.centralwidget)
  21. self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
  22. self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
  23. self.frame.setObjectName("frame")
  24. self.frame_2 = QtWidgets.QFrame(self.frame)
  25. self.frame_2.setGeometry(QtCore.QRect(10, 10, 276, 581))
  26. self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
  27. self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
  28. self.frame_2.setObjectName("frame_2")
  29. self.verticalLayout = QtWidgets.QVBoxLayout(self.frame_2)
  30. self.verticalLayout.setObjectName("verticalLayout")
  31. self.groupBox = QtWidgets.QGroupBox(self.frame_2)
  32. self.groupBox.setObjectName("groupBox")
  33. self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox)
  34. self.verticalLayout_2.setObjectName("verticalLayout_2")
  35. self.radioButton = QtWidgets.QRadioButton(self.groupBox)
  36. self.radioButton.setObjectName("radioButton")
  37. self.verticalLayout_2.addWidget(self.radioButton)
  38. self.radioButton_2 = QtWidgets.QRadioButton(self.groupBox)
  39. self.radioButton_2.setObjectName("radioButton_2")
  40. self.radioButton_2.clicked.connect(self.plot1)
  41. self.verticalLayout_2.addWidget(self.radioButton_2)
  42. self.radioButton_3 = QtWidgets.QRadioButton(self.groupBox)
  43. self.radioButton_3.setObjectName("radioButton_3")
  44. self.verticalLayout_2.addWidget(self.radioButton_3)
  45. self.radioButton_4 = QtWidgets.QRadioButton(self.groupBox)
  46. self.radioButton_4.setObjectName("radioButton_4")
  47. self.verticalLayout_2.addWidget(self.radioButton_4)
  48. self.verticalLayout.addWidget(self.groupBox)
  49. self.tableWidget = QtWidgets.QTableWidget(self.frame_2)
  50. self.tableWidget.setObjectName("tableWidget")
  51. self.tableWidget.setColumnCount(0)
  52. self.tableWidget.setRowCount(0)
  53. self.verticalLayout.addWidget(self.tableWidget)
  54. self.horizontalLayout.addWidget(self.frame)
  55. MainWindow.setCentralWidget(self.centralwidget)
  56. self.statusbar = QtWidgets.QStatusBar(MainWindow)
  57. self.statusbar.setObjectName("statusbar")
  58. MainWindow.setStatusBar(self.statusbar)
  59. self.toolBar = QtWidgets.QToolBar(MainWindow)
  60. self.toolBar.setMinimumSize(QtCore.QSize(6, 44))
  61. self.toolBar.setObjectName("toolBar")
  62. MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
  63. self.action_open = QtWidgets.QAction(MainWindow)
  64. self.action_open.setCheckable(True)
  65. self.action_open.setEnabled(True)
  66. icon = QtGui.QIcon()
  67. icon.addPixmap(QtGui.QPixmap("C:/Users/yanjiaxi/Pictures/微信截图_20230415215247.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
  68. self.action_open.setIcon(icon)
  69. self.action_open.setShortcutContext(QtCore.Qt.WindowShortcut)
  70. self.action_open.setObjectName("action_open")
  71. self.action_open.triggered.connect(self.load_data)
  72. self.action_save = QtWidgets.QAction(MainWindow)
  73. icon1 = QtGui.QIcon()
  74. icon1.addPixmap(QtGui.QPixmap("C:/Users/yanjiaxi/Pictures/微信截图_20230415215347.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
  75. self.action_save.setIcon(icon1)
  76. self.action_save.setObjectName("action_save")
  77. self.action_larger = QtWidgets.QAction(MainWindow)
  78. icon2 = QtGui.QIcon()
  79. icon2.addPixmap(QtGui.QPixmap("C:/Users/yanjiaxi/Pictures/下载.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
  80. self.action_larger.setIcon(icon2)
  81. self.action_larger.setObjectName("action_larger")
  82. self.action_smaller = QtWidgets.QAction(MainWindow)
  83. icon3 = QtGui.QIcon()
  84. icon3.addPixmap(QtGui.QPixmap("C:/Users/yanjiaxi/Pictures/下载 (1).jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
  85. self.action_smaller.setIcon(icon3)
  86. self.action_smaller.setObjectName("action_smaller")
  87. self.toolBar.addAction(self.action_open)
  88. self.toolBar.addSeparator()
  89. self.toolBar.addAction(self.action_save)
  90. self.toolBar.addSeparator()
  91. self.toolBar.addAction(self.action_larger)
  92. self.toolBar.addSeparator()
  93. self.toolBar.addAction(self.action_smaller)
  94. self.curve = PlotWidgets.CurvesWidget()
  95. self.curve.setAutoFillBackground(True)
  96. self.horizontalLayout_8 = QtWidgets.QSplitter(self.frame)
  97. self.horizontalLayout_8.addWidget(self.frame_2)
  98. self.horizontalLayout_8.addWidget(self.curve)
  99. self.horizontalLayout_9 = QtWidgets.QVBoxLayout(self.frame)
  100. self.horizontalLayout_9.addWidget(self.horizontalLayout_8)
  101. # self.radioButton_2.clicked.connect(self.plot1)
  102. # self.rocCurveGraph.plotloocvcurve()
  103. self.retranslateUi(MainWindow)
  104. QtCore.QMetaObject.connectSlotsByName(MainWindow)
  105. def retranslateUi(self, MainWindow):
  106. _translate = QtCore.QCoreApplication.translate
  107. MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
  108. self.groupBox.setTitle(_translate("MainWindow", "作图类型"))
  109. self.radioButton.setText(_translate("MainWindow", "柱状图"))
  110. self.radioButton_2.setText(_translate("MainWindow", "折线图"))
  111. self.radioButton_3.setText(_translate("MainWindow", "饼图"))
  112. self.radioButton_4.setText(_translate("MainWindow", "极坐标图"))
  113. self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
  114. self.action_open.setText(_translate("MainWindow", "打开文件"))
  115. self.action_save.setText(_translate("MainWindow", "保存"))
  116. self.action_larger.setText(_translate("MainWindow", "放大"))
  117. self.action_smaller.setText(_translate("MainWindow", "缩小"))
  118. def load_data(self):
  119. import pandas as pd
  120. try:
  121. self.file, ok = QFileDialog.getOpenFileName(self, 'Open', './datas', 'Plan text (*.*)')
  122. train_Data = pd.read_csv(self.file,index_col = 0)
  123. input_table_rows = train_Data.shape[0]
  124. input_table_colunms = train_Data.shape[1]
  125. input_table_header = train_Data.columns.values.tolist()
  126. self.tableWidget.setColumnCount(input_table_colunms)
  127. self.tableWidget.setRowCount(input_table_rows)
  128. self.tableWidget.setHorizontalHeaderLabels(input_table_header)
  129. for i in range(len(train_Data.index)):
  130. for j in range(len(train_Data.columns)):
  131. self.tableWidget.setItem(i, j, QTableWidgetItem(str(train_Data.iloc[i, j])))
  132. except Exception as e:
  133. QMessageBox.critical(self, 'Error', str(e), QMessageBox.Ignore | QMessageBox.Reset, QMessageBox.Ignore)
  134. return self.file
  135. def plot1(self):
  136. if self.radioButton_2.isChecked() == True:
  137. sip.delete(self.curve)
  138. self.curve = PlotWidgets.CurvesWidget()
  139. self.horizontalLayout_8.addWidget(self.curve)
  140. self.curve.plotloocvcurve()
  141. pass
  142. if __name__ == '__main__':
  143. app = QApplication(sys.argv)
  144. app.setFont(QFont('Arial', 10))
  145. win = Ui_MainWindow()
  146. win.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
  147. win.show()
  148. sys.exit(app.exec_())

总结

本小节,我们重点介绍了QtDesigner界面设计中的关键环节--布局,同时实现了一个简易的数据展示界面。通过此简易界面设计,掌握:布局、QAction、QGroupBox等容器控件的使用。针对绘图展示及其QAction槽函数关联,我们后续详细讲解。

更多内容,参考订阅号:数道

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/652832
推荐阅读
相关标签
  

闽ICP备14008679号