一问一答学习PyQT6,对比WxPython和PyQt6的差异

打印 上一主题 下一主题

主题 821|帖子 821|积分 2463

在我的基于WxPython的跨平台框架完成后,对WxPython的机动性以及强盛功能有了很深的相识,在跨平台的桌面应用上我突然对PyQt6的开发也感兴趣,于是准备了开发环境学习PyQt 6,并对比下WxPython的差异来举行深入的相识,发现它们很多理念和做法是如此的类似。
1、pyqt6都有那些布局控件?

PyQt6 提供了多种布局控件,帮助开发者轻松地将界面元素排列在窗口中。对比发现它们和WxPython简直是双胞胎一样非常相似,以下是常用的布局控件及其扼要介绍:
1) QHBoxLayout (水平布局)

QHBoxLayout 是一个水平布局管理器,它会将窗口中的控件从左到右地排列。
  1. from PyQt6.QtWidgets import QWidget, QHBoxLayout, QPushButton
  2. widget = QWidget()
  3. layout = QHBoxLayout()
  4. layout.addWidget(QPushButton('Button 1'))
  5. layout.addWidget(QPushButton('Button 2'))
  6. widget.setLayout(layout)
  7. widget.show()
复制代码
2)QVBoxLayout (垂直布局)

QVBoxLayout 是一个垂直布局管理器,它会将控件从上到下地排列。
  1. from PyQt6.QtWidgets import QWidget, QVBoxLayout, QPushButton
  2. widget = QWidget()
  3. layout = QVBoxLayout()
  4. layout.addWidget(QPushButton('Button 1'))
  5. layout.addWidget(QPushButton('Button 2'))
  6. widget.setLayout(layout)
  7. widget.show()
复制代码
3)QGridLayout (网格布局)

QGridLayout 是一个网格布局管理器,控件被排列在一个网格中,类似于表格。
  1. from PyQt6.QtWidgets import QWidget, QGridLayout, QPushButton
  2. widget = QWidget()
  3. layout = QGridLayout()
  4. layout.addWidget(QPushButton('Button 1'), 0, 0)
  5. layout.addWidget(QPushButton('Button 2'), 0, 1)
  6. layout.addWidget(QPushButton('Button 3'), 1, 0)
  7. widget.setLayout(layout)
  8. widget.show()
复制代码
PyQt6 中,类似于 wxPythonGridBagSizer,即可以让控件跨行和跨列的布局功能,通常通过使用 QGridLayout 来实现。QGridLayout 允许你指定控件的位置和它们所占的行列范围,从而实现跨行和跨列的布局。
QGridLayout 是 PyQt6 中的网格布局管理器,它允许控件按行列排列,你可以通过指定控件所在的行和列来控制它们的位置。如果需要让控件跨越多个行或列,可以通过设置控件的 rowSpancolumnSpan 来实现。
  1. # 添加控件,指定位置 (行, 列) 以及跨越的行和列
  2. layout.addWidget(QPushButton('Button 1'), 0, 0)  # 第 1 个按钮
  3. layout.addWidget(QPushButton('Button 2'), 0, 1)  # 第 2 个按钮
  4. layout.addWidget(QPushButton('Button 3'), 1, 0, 1, 2)  # 第 3 个按钮跨越 1 行 2 列
复制代码
你还可以根据需求自由配置控件在 QGridLayout 中的位置,包括:

  • 控件的对齐方式:Qt.Alignment。
  • 控件之间的间隔:setHorizontalSpacing() 和 setVerticalSpacing()。
  • 设置行和列的固定大小或自适应大小:setRowMinimumHeight()、setColumnMinimumWidth() 等。
4)QFormLayout (表单布局)

QFormLayout 用于创建一个表单式的布局,控件和标签按“标签-控件”对的形式排列。
  1. from PyQt6.QtWidgets import QWidget, QFormLayout, QLabel, QLineEdit
  2. widget = QWidget()
  3. layout = QFormLayout()
  4. layout.addRow(QLabel('Name:'), QLineEdit())
  5. layout.addRow(QLabel('Age:'), QLineEdit())
  6. widget.setLayout(layout)
  7. widget.show()
复制代码
5)QStackedLayout (堆叠布局)

QStackedLayout 允许多个控件堆叠在一起,且一次只显示其中一个控件。
  1. from PyQt6.QtWidgets import QWidget, QStackedLayout, QPushButton
  2. widget = QWidget()
  3. layout = QStackedLayout()
  4. layout.addWidget(QPushButton('Page 1'))
  5. layout.addWidget(QPushButton('Page 2'))
  6. widget.setLayout(layout)
  7. widget.show()
  8. # 切换页面
  9. layout.setCurrentIndex(1)  # 切换到 Page 2
复制代码
6)QSplitter (分割器)

QSplitter 允许用户通过拖动分隔条来调整控件的大小。通常用于布局中需要用户可调整分配空间的控件。
  1. from PyQt6.QtWidgets import QWidget, QSplitter, QVBoxLayout, QPushButton
  2. from PyQt6.QtCore import Qt
  3. widget = QWidget()
  4. layout = QVBoxLayout()
  5. splitter = QSplitter(Qt.Orientation.Horizontal)
  6. splitter.addWidget(QPushButton('Button 1'))
  7. splitter.addWidget(QPushButton('Button 2'))
  8. layout.addWidget(splitter)
  9. widget.setLayout(layout)
  10. widget.show()
复制代码
如果对多个窗口放置在Splitter控件里面, 可以得到如下界面。

 
7)QBoxLayout (基础布局,QHBoxLayout 和 QVBoxLayout 的基类)

QBoxLayout 是 QHBoxLayout 和 QVBoxLayout 的基类,可以选择水平或垂直方向来排列控件。
  1. from PyQt6.QtWidgets import QWidget, QBoxLayout, QPushButton
  2. from PyQt6.QtCore import Qt
  3. widget = QWidget()
  4. layout = QBoxLayout(QBoxLayout.Direction.LeftToRight)
  5. layout.addWidget(QPushButton('Button 1'))
  6. layout.addWidget(QPushButton('Button 2'))
  7. widget.setLayout(layout)
  8. widget.show()
复制代码
PyQt6 提供了多种布局管理器,能够机动地处理差别控件之间的关系。常见的布局管理器包括 QHBoxLayout、QVBoxLayout、QGridLayout、QFormLayout 等。差别的布局管理器适用于差别的场景,帮助开发者更好地控制控件的排列和显示方式。
我整理了以上的代码,而且整合上面所有布局的案例代码在一个界面上,如下所示效果。

而且PyQT6可以通过样式设置一些特殊的效果,如下所示。
可以通过setStyle或者 setStyleSheet 函数方式指定差别的界面效果。
  1. if __name__ == '__main__':
  2.     app = QApplication(sys.argv)
  3.     app.setStyle('Fusion')  # 设置样式
  4.     # app.setStyle('Windows')
  5.     # app.setStyle('WindowsVista')
  6.     # app.setStyle('Macintosh')
  7.     # app.setStyle('GTK')
  8.     # app.setStyle('CleanLooks')
  9.     # app.setStyle('Plastique')
  10.     # 设置背景颜色
  11.     # app.setStyleSheet("QWidget { background-color: white; }")
  12.     app.setStyleSheet("""
  13.         QPushButton {
  14.             background-color: #008CBA;
  15.             color: white;
  16.             font-size: 16px;
  17.             padding: 10px 20px;
  18.             border-radius: 5px;
  19.             border: 2px solid #006F8C;
  20.         }
  21.         QPushButton:hover {
  22.             background-color: #006F8C;
  23.             border: 2px solid #008CBA;
  24.         }
  25.         QPushButton:pressed {
  26.             background-color: #004F68;
  27.             border: 2px solid #006F8C;
  28.         }
  29.     """)
  30.     # 创建窗口对象
  31.     form = QWidgetExample()
  32.     form.show()# 启动应用程序的事件循环
  33.     sys.exit(app.exec())
复制代码

如果我们需要类似一个主窗口界面那样,可以实现如下效果。

 
2、我对wxpython的控件比较相识,如果学习pyqt6,怎样入手,对比介绍一下

如果你已经对 wxPython 的控件比较熟悉,学习 PyQt6 会变得更加轻易,因为这两个框架在很多方面有相似之处,但 PyQt6 提供了更多的功能和机动性,尤其是在与 Qt 的集成方面。为了帮助你更顺遂地过渡,下面我会通过对比两者来介绍 PyQt6 的核心概念和控件。
1)应用步伐和窗口


  • wxPython

    • 创建应用步伐使用 wx.App,创建窗口使用 wx.Frame。

  • PyQt6

    • 创建应用步伐使用 QApplication,创建窗口使用 QWidget 或者 QMainWindow。
    • QWidget 是所有控件和窗口的基类,QMainWindow 是带有菜单、工具栏、状态栏的窗口。
    对比:

    • wx.Frame 和 QMainWindow 类似,都是用于创建主窗口,QWidget 则是 PyQt6 中的基本窗口组件。

  1. # wxPython
  2. import wx
  3. app = wx.App(False)
  4. frame = wx.Frame(None, wx.ID_ANY, "Hello wxPython")
  5. frame.Show()
  6. app.MainLoop()
复制代码
  1. # PyQt6
  2. from PyQt6.QtWidgets import QApplication, QMainWindow
  3. app = QApplication([])
  4. window = QMainWindow()
  5. window.setWindowTitle('Hello PyQt6')
  6. window.show()
  7. app.exec()
复制代码
2) 布局管理


  • wxPython

    • 常用布局管理器有 BoxSizer、GridBagSizer、GridSizer 等。

  • PyQt6

    • 常用布局管理器有 QVBoxLayout、QHBoxLayout、QGridLayout、QFormLayout、QStackedLayout 等。
    对比:

    • BoxSizer 对应 PyQt6 的 QBoxLayout(QHBoxLayout 和 QVBoxLayout 是它的具体实现),它们都用于水平或垂直排列控件。
    • GridBagSizer 对应 PyQt6 的 QGridLayout,它允许控件跨行和跨列。

  1. # wxPython
  2. sizer = wx.BoxSizer(wx.HORIZONTAL)
  3. sizer.Add(wx.Button(frame, label="Button 1"))
  4. sizer.Add(wx.Button(frame, label="Button 2"))
  5. frame.SetSizer(sizer)
复制代码
  1. # PyQt6
  2. from PyQt6.QtWidgets import QVBoxLayout, QPushButton
  3. layout = QVBoxLayout()
  4. layout.addWidget(QPushButton("Button 1"))
  5. layout.addWidget(QPushButton("Button 2"))
  6. window.setLayout(layout)
复制代码
上面PyQt6步伐截图的案例,我综合了各个PyQT6的各个布局处理,整合在一个窗口里面,代码如下所示。
  1. import sys
  2. from PyQt6.QtWidgets import QApplication, QMainWindow, QWidget, QToolBar, QStatusBar, QMenuBar, QDialog, QLabel, QLineEdit, QTextEdit, QPushButton
  3. from PyQt6.QtGui import QAction, QIcon  # 导入 QIcon 用于设置图标
  4. from PyQt6.QtCore import Qt
  5. from PyQt6.QtWidgets import QLayout, QBoxLayout, QHBoxLayout, QVBoxLayout,QGridLayout, QFormLayout, QStackedLayout, QSplitter, QScrollArea, QSizePolicy, QSpacerItem, QSizePolicy, QMessageBox
  6.    
  7. class QWidgetExample(QWidget):
  8.     def __init__(self):
  9.         super().__init__()
  10.         self.setWindowTitle('QWidget Example')
  11.         # QBoxLayout
  12.         # main_layout = QBoxLayout(QBoxLayout.Direction.LefoRight) # 0
  13.         main_layout = QVBoxLayout() #1
  14.         btn_widget = QWidget()
  15.         layout_btn = QHBoxLayout() #2
  16.         layout_btn.addWidget(QPushButton('Button 1'), stretch=1)
  17.         layout_btn.addWidget(QPushButton('Button 2'))
  18.         btn_widget.setLayout(layout_btn)
  19.         main_layout.addWidget(btn_widget)
  20.         # QGridLayout
  21.         grid_widget = QWidget()
  22.         layout_grid = QGridLayout() #3
  23.         layout_grid.addWidget(QPushButton('Button 1'), 0, 0)
  24.         layout_grid.addWidget(QPushButton('Button 2'), 0, 1)
  25.         layout_grid.addWidget(QPushButton('Button 3'), 1, 0, 1, 2)  # 第 3 个按钮跨越 1 行 2 列
  26.         grid_widget.setLayout(layout_grid)
  27.         main_layout.addWidget(grid_widget)
  28.         #form layout
  29.         form_widget = QWidget()
  30.         layout_form = QFormLayout() #4
  31.         layout_form.addRow(QLabel('Name:'), QLineEdit(placeholderText='Enter your name'))
  32.         layout_form.addRow(QLabel('Age:'), QLineEdit( text='25', readOnly=True))
  33.         layout_form.addRow(QLabel('Note:'), QTextEdit(placeholderText='Enter your note'))
  34.         button = QPushButton('Submit')
  35.         button.setToolTip('Click to submit')
  36.         button.clicked.connect(self.on_button_click)
  37.         layout_form.addRow(button)
  38.         # 设置字段增长策略,使输入控件可以拉伸
  39.         layout_form.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.ExpandingFieldsGrow)
  40.         form_widget.setLayout(layout_form)
  41.         # 添加到布局中
  42.         main_layout.addWidget(form_widget)
  43.         #stacked layout
  44.         stacked_widget = QWidget()
  45.         layout_stacked = QStackedLayout() #5
  46.         layout_stacked.addWidget(QPushButton('Page 1'))
  47.         layout_stacked.addWidget(QPushButton('Page 2'))
  48.         # 切换页面
  49.         layout_stacked.setCurrentIndex(1)  # 切换到 Page 2
  50.         stacked_widget.setLayout(layout_stacked)
  51.         main_layout.addWidget(stacked_widget)
  52.             
  53.         #QSplitter
  54.         splitter_widget = QWidget()
  55.         layout_splitter = QVBoxLayout()
  56.         splitter = QSplitter(Qt.Orientation.Horizontal)
  57.         splitter.addWidget(QPushButton('Left'))
  58.         splitter.addWidget(QPushButton('Right'))
  59.         layout_splitter.addWidget(splitter)
  60.         layout_splitter.setStretchFactor(splitter, 1)
  61.         splitter_widget.setLayout(layout_splitter)
  62.         main_layout.addWidget(splitter_widget)
  63.         self.setLayout(main_layout)
  64.         
  65.     def on_button_click(self):
  66.         print('Button clicked')
  67.     def closeEvent(self, event):
  68.         reply = QMessageBox.question(self, 'Message',
  69.                     "Are you sure to quit?", QMessageBox.StandardButton.Yes |
  70.                     QMessageBox.StandardButton.No, QMessageBox.StandardButton.No)
  71.         if reply == QMessageBox.StandardButton.Yes:
  72.             event.accept()
  73.         else:
  74.             event.ignore()
  75. if __name__ == '__main__':
  76.     app = QApplication(sys.argv)
  77.     app.setStyle('Fusion')  # 设置样式
  78.     # 创建窗口对象
  79.     form = QWidgetExample()
  80.     form.show()# 启动应用程序的事件循环
  81.     sys.exit(app.exec())
复制代码
3) 事件和信号槽机制


  • wxPython

    • 使用事件绑定(Bind)将事件与处理函数连接起来。比方,EVT_BUTTON 处理按钮点击事件。

  • PyQt6

    • 使用信号和槽机制。控件发出信号,其他控件(或类)可以通过槽(方法)连接并响应这些信号。
    • 在 PyQt 中,信号和槽的连接更机动,可以通过 connect() 方法绑定。
    对比:

    • 在事件处理上,PyQt6 的信号槽机制比 wxPython 的事件机制更加模块化和松耦合。

  1. # wxPython
  2. button.Bind(wx.EVT_BUTTON, on_button_click)
复制代码
  1. # PyQt6
  2. button.clicked.connect(on_button_click)
复制代码
4) 控件和小部件


  • wxPython

    • 提供的常用控件有:wx.Button, wx.TextCtrl, wx.ListCtrl, wx.ComboBox 等。

  • PyQt6

    • 提供的常用控件有:QPushButton, QTextEdit, QListView, QComboBox 等。
    • PyQt6 的控件通常会比 wxPython 的控件具有更多的功能和更丰富的自定义选项。
    对比:

    • wx.Button 与 QPushButton 类似,wx.TextCtrl 与 QTextEdit 类似,wx.ComboBox 与 QComboBox 类似。
    • 在 PyQt6 中,控件支持更丰富的样式和自定义,可以通过 QStyle 和 QPainter 举行更精细的绘制。 

  1. # wxPython
  2. text_ctrl = wx.TextCtrl(frame)
复制代码
  1. # PyQt6
  2. text_edit = QTextEdit()
复制代码
5) 对话框和模态


  • wxPython

    • 使用 wx.Dialog 来创建自定义对话框,使用 ShowModal() 来展示模态对话框。

  • PyQt6

    • 使用 QDialog 来创建对话框,使用 exec() 来展示模态对话框。
    对比:

    • PyQt6 的对话框和 wxPython 相似,但 exec() 方法在 PyQt6 中表现模态对话框的显示,而在 wxPython 中是 ShowModal()。

  1. # wxPython
  2. dialog = wx.MessageDialog(frame, "Hello", "Greeting", wx.OK)
  3. dialog.ShowModal()
复制代码
  1. # PyQt6
  2. from PyQt6.QtWidgets import QDialog, QVBoxLayout, QPushButton
  3. dialog = QDialog()
  4. layout = QVBoxLayout()
  5. layout.addWidget(QPushButton('OK'))
  6. dialog.setLayout(layout)
  7. dialog.exec()
复制代码
6) 样式和主题


  • wxPython

    • 支持系统的原生控件样式,也可以通过 wx.SystemSettings 和 wx.ArtProvider 来举行主题自定义。

  • PyQt6

    • 使用 QSS (Qt Style Sheets) 来自定义控件的表面,类似于 CSS。PyQt6 提供了强盛的样式定制能力。
    对比:

    • PyQt6 的样式机制更靠近 Web 开发中的 CSS,使用 QSS 使得界面定制更具机动性和同等性。

  1. # wxPython
  2. frame.SetBackgroundColour(wx.Colour(255, 255, 255))
复制代码
  1. # PyQt6
  2. app.setStyleSheet("QWidget { background-color: white; }")
复制代码
 
3、wxpython中的wx.MessageBox消息对话框,以及打开文件对话框、字体对话框、颜色对话框等常用对话框,怎样在PyQT6中实现

在 PyQt6 中,你可以使用 QMessageBox 来替换 wxPython 中的 wx.MessageBox,并使用差别的对话框组件来替换文件选择对话框、字体对话框、颜色对话框等。下面是这些常用对话框在 PyQt6 中的实现示例:
1) 消息对话框 (QMessageBox)

在 PyQt6 中,你可以使用 QMessageBox 来创建类似于 wx.MessageBox 的消息框。
  1. from PyQt6.QtWidgets import QApplication, QMessageBox, QPushButton
  2. def show_message_box():
  3.     app = QApplication([])
  4.     # 创建消息对话框
  5.     msg = QMessageBox()
  6.     msg.setIcon(QMessageBox.Icon.Information)  # 设置图标
  7.     msg.setText("This is an info message.")
  8.     msg.setWindowTitle("Info")
  9.     msg.setStandardButtons(QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Cancel)
  10.     # 显示对话框并获取响应
  11.     response = msg.exec()
  12.     if response == QMessageBox.StandardButton.Ok:
  13.         print("OK clicked")
  14.     else:
  15.         print("Cancel clicked")
  16.     app.exec()
  17. show_message_box()
复制代码
2)打开文件对话框 (QFileDialog)

在 PyQt6 中,QFileDialog 用于打开和保存文件,类似于 wxPython 中的 wx.FileDialog。
  1. from PyQt6.QtWidgets import QApplication, QFileDialog, QPushButton
  2. def open_file_dialog():
  3.     app = QApplication([])
  4.     # 创建打开文件对话框
  5.     options = QFileDialog.Option.ReadOnly
  6.     file_name, _ = QFileDialog.getOpenFileName(None, "Open File", "", "All Files (*)", options=options)
  7.     if file_name:
  8.         print(f"File selected: {file_name}")
  9.     else:
  10.         print("No file selected")
  11.     app.exec()
  12. open_file_dialog()
复制代码
3) 字体对话框 (QFontDialog)

QFontDialog 用于选择字体,在 PyQt6 中的使用方式类似于 wxPython 中的 wx.FontDialog。
  1. from PyQt6.QtWidgets import QApplication, QFontDialog, QPushButton
  2. def font_dialog():
  3.     app = QApplication([])
  4.     # 创建字体对话框
  5.     font, ok = QFontDialog.getFont()
  6.     if ok:
  7.         print(f"Selected font: {font.family()}, size: {font.pointSize()}")
  8.     else:
  9.         print("No font selected")
  10.     app.exec()
  11. font_dialog()
复制代码
4)颜色对话框 (QColorDialog)

QColorDialog 用于选择颜色,类似于 wxPython 中的 wx.ColourDialog。
  1. from PyQt6.QtWidgets import QApplication, QColorDialog, QPushButton
  2. def color_dialog():
  3.     app = QApplication([])
  4.     # 创建颜色对话框
  5.     color = QColorDialog.getColor()
  6.     if color.isValid():
  7.         print(f"Selected color: {color.name()}")
  8.     else:
  9.         print("No color selected")
  10.     app.exec()
  11. color_dialog()
复制代码
5) 文件保存对话框 (QFileDialog)

保存文件对话框也使用 QFileDialog,通过指定保存选项来实现。
  1. from PyQt6.QtWidgets import QApplication, QFileDialog
  2. def save_file_dialog():
  3.     app = QApplication([])
  4.     # 创建保存文件对话框
  5.     file_name, _ = QFileDialog.getSaveFileName(None, "Save File", "", "Text Files (*.txt);;All Files (*)")
  6.     if file_name:
  7.         print(f"File will be saved as: {file_name}")
  8.     else:
  9.         print("No file selected for saving")
  10.     app.exec()
  11. save_file_dialog()
复制代码
在 wxPython 中,可以使用 wx.DirDialog 来选择目录。在 PyQt6 中,QFileDialog 也支持目录选择,只需要指定 FileMode 为 QFileDialog.Directory。
  1. from PyQt6.QtWidgets import QApplication, QFileDialog, QPushButton
  2. def directory_dialog():
  3.     app = QApplication([])
  4.     # 创建选择目录的对话框
  5.     directory = QFileDialog.getExistingDirectory(None, "Select Directory")
  6.     if directory:
  7.         print(f"Selected directory: {directory}")
  8.     else:
  9.         print("No directory selected")
  10.     app.exec()
  11. directory_dialog()
复制代码
总结

  • wx.MessageBox -> QMessageBox
  • wx.FileDialog -> QFileDialog(同样用于打开和保存文件)
  • wx.FontDialog -> QFontDialog
  • wx.ColourDialog -> QColorDialog
这些对话框的功能和 PyQt6 中的相应控件类似,基本上可以通过这些标准控件实现与 wxPython 雷同的效果。
 
4、wxpython的控件和pyQT的常用控件对比一下

常用控件包括标签、单行文本、多行文本、日期、数值、单选框、复选框、Combobox下拉列表、树形下拉列表、图片显示等常用控件。
以下是 wxPythonPyQt6 中常用控件的对比,涵盖标签、文本框、日期、数值、单选框、复选框、下拉列表、树形控件、图片显示等控件的对应关系及其使用示例。
1) 标签(Label)


  • wxPython: 使用 wx.StaticText
  • PyQt6: 使用 QLabel
2)单行文本框(Single-line Text)


  • wxPython: 使用 wx.TextCtrl,并设置 style=wx.TE_SINGLELINE
  • PyQt6: 使用 QLineEdit
3)多行文本框(Multi-line Text)


  • wxPython: 使用 wx.TextCtrl,并设置 style=wx.TE_MULTILINE
  • PyQt6: 使用 QTextEdit
4)日期选择框(Date Picker)


  • wxPython: 使用 wx.adv.DatePickerCtrl
  • PyQt6: 使用 QDateEdit
5)数值输入框(Number Input)


  • wxPython: 使用 wx.TextCtrl 或 wx.SpinCtrl或者 wx.SpinCtrlDouble
    (带有上下箭头的数值框)
  • PyQt6: 使用 QSpinBox 或 QDoubleSpinBox
6)单选框(Radio Button)


  • wxPython: 使用 wx.RadioButton
  • PyQt6: 使用 QRadioButton
wx.RadioBox 是一个带有多个单选按钮的控件,允许用户在多个选项中选择一个。在 PyQt6 中,可以使用 QRadioButton 与 QButtonGroup 来实现类似的效果。
7) 复选框(Check Box)


  • wxPython: 使用 wx.CheckBox
  • PyQt6: 使用 QCheckBox
wx.CheckListBox 允许用户在多个选项中选择多个项。PyQt6 中没有直接对应的控件,但可以使用 QCheckBox 和布局控件组合来实现类似的效果。
如果要实现类似FieldSet的效果,如下所示。

代码如下所示
  1. from PyQt6.QtWidgets import QApplication, QWidget, QRadioButton, QCheckBox, QVBoxLayout, QGroupBox, QButtonGroup, QFormLayout
  2. from PyQt6.QtCore import Qt
  3. class FieldSetExample(QWidget):
  4.     def __init__(self):
  5.         super().__init__()
  6.         self.setWindowTitle("FieldSet Example")
  7.         
  8.         # 创建单选按钮
  9.         self.radio1 = QRadioButton("Option 1")
  10.         self.radio2 = QRadioButton("Option 2")
  11.         
  12.         # 创建复选框
  13.         self.check1 = QCheckBox("Additional Option 1")
  14.         self.check2 = QCheckBox("Additional Option 2")
  15.         
  16.         # 创建按钮组以保证单选功能
  17.         self.button_group = QButtonGroup(self)
  18.         self.button_group.addButton(self.radio1)
  19.         self.button_group.addButton(self.radio2)
  20.         
  21.         # 创建 QGroupBox 来实现 FieldSet 效果
  22.         group_box = QGroupBox("Select Your Options")  # 设置标题
  23.         layout = QVBoxLayout()
  24.         layout.addWidget(self.radio1)
  25.         layout.addWidget(self.radio2)
  26.         group_box.setLayout(layout)
  27.         
  28.         # 创建另一个 QGroupBox 来显示复选框
  29.         check_box_group = QGroupBox("Additional Options")
  30.         check_layout = QVBoxLayout()
  31.         check_layout.addWidget(self.check1)
  32.         check_layout.addWidget(self.check2)
  33.         check_box_group.setLayout(check_layout)
  34.         # 设置主布局
  35.         main_layout = QFormLayout()
  36.         main_layout.addWidget(group_box)
  37.         main_layout.addWidget(check_box_group)
  38.         
  39.         self.setLayout(main_layout)
  40.         # 显示窗口
  41.         self.show()
  42. app = QApplication([])
  43. window = FieldSetExample()
  44. app.exec()
复制代码
 
8)下拉列表(ComboBox)


  • wxPython: 使用 wx.ComboBox
  • PyQt6: 使用 QComboBox
在 QComboBox 中添加自定义对象,如果对象类是 CListItem(Text, Value),可以通过将对象作为 QComboBox 的项来存储。你可以创建一个自定义的类(比方 CListItem),并使用 addItem() 方法将自定义对象添加到 QComboBox 中。
为了将 CListItem 添加到 QComboBox,你需要确保在添加项时使用自定义的文本显示,而在获取选中项时能够精确地获取到对应的 Value。
  1. from PyQt6.QtWidgets import QApplication, QWidget, QComboBox, QVBoxLayout
  2. from PyQt6.QtCore import Qt
  3. class CListItem:
  4.     def __init__(self, text, value):
  5.         self.text = text
  6.         self.value = value
  7.     def __repr__(self):
  8.         return f"CListItem(text={self.text}, value={self.value})"
  9. class MyWindow(QWidget):
  10.     def __init__(self):
  11.         super().__init__()
  12.         self.initUI()
  13.     def initUI(self):
  14.         layout = QVBoxLayout(self)
  15.         # 创建 QComboBox
  16.         combo = QComboBox(self)
  17.         
  18.         # 创建自定义对象 CListItem 并添加到 QComboBox
  19.         item1 = CListItem("Item 1", 100)
  20.         item2 = CListItem("Item 2", 200)
  21.         item3 = CListItem("Item 3", 300)
  22.         
  23.         # 使用 addItem 添加文本显示的同时存储 CListItem 对象
  24.         combo.addItem(item1.text, item1)  # item1.text 是显示文本,item1 是存储对象
  25.         combo.addItem(item2.text, item2)  # item2.text 是显示文本,item2 是存储对象
  26.         combo.addItem(item3.text, item3)  # item3.text 是显示文本,item3 是存储对象
  27.         
  28.         # 连接槽函数,获取选中的 CListItem 对象
  29.         combo.currentIndexChanged.connect(self.on_combobox_changed)
  30.         
  31.         # 将 QComboBox 添加到布局中
  32.         layout.addWidget(combo)
  33.         self.setLayout(layout)
  34.     def on_combobox_changed(self, index):
  35.         # 获取当前选中的 CListItem 对象
  36.         combo = self.sender()
  37.         item = combo.itemData(index)
  38.         if item:
  39.             print(f"Selected item: {item} with value {item.value}")
  40. app = QApplication([])
  41. window = MyWindow()
  42. window.setWindowTitle("QComboBox with Custom Objects")
  43. window.resize(300, 150)
  44. window.show()
  45. app.exec()
复制代码
 
9)树形控件(Tree Control)


  • wxPython: 使用 wx.TreeCtrl
  • PyQt6: 使用 QTreeView 与 QStandardItemModel
10)图片显示(Image Display)


  • wxPython: 使用 wx.StaticBitmap
  • PyQt6: 使用 QLabel 或 QPixmap
 总结

wxPython 控件PyQt6 控件阐明wx.StaticTextQLabel标签wx.TextCtrlQLineEdit单行文本框wx.TextCtrl (multiline)QTextEdit多行文本框wx.adv.DatePickerCtrlQDateEdit日期选择框wx.SpinCtrlQSpinBox, QDoubleSpinBox数值输入框wx.RadioButtonQRadioButton单选框wx.CheckBoxQCheckBox复选框wx.ComboBoxQComboBox下拉列表wx.TreeCtrlQTreeView, QStandardItemModel树形控件wx.StaticBitmapQLabel with QPixmap图片显示通过这些对比,你可以更轻易地在 PyQt6 中找到对应的控件,并使用相似的方式构建用户界面。
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表