在我的基于WxPython的跨平台框架完成后,对WxPython的灵活性以及强大功能有了很深的了解,在跨平台的桌面应用上我突然对PyQt6的开发也感兴趣,于是准备了开发环境学习PyQt 6,并对比下WxPython的差异来进行深入的了解,发现它们很多理念和做法是如此的类似。

1、pyqt6都有那些布局控件?

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

1) QHBoxLayout (水平布局)

QHBoxLayout 是一个水平布局管理器,它会将窗口中的控件从左到右地排列。

from PyQt6.QtWidgets import QWidget, QHBoxLayout, QPushButton

widget = QWidget()
layout = QHBoxLayout() layout.addWidget(QPushButton('Button 1'))
layout.addWidget(QPushButton('Button 2')) widget.setLayout(layout)
widget.show()

2)QVBoxLayout (垂直布局)

QVBoxLayout 是一个垂直布局管理器,它会将控件从上到下地排列。

from PyQt6.QtWidgets import QWidget, QVBoxLayout, QPushButton

widget = QWidget()
layout = QVBoxLayout() layout.addWidget(QPushButton('Button 1'))
layout.addWidget(QPushButton('Button 2')) widget.setLayout(layout)
widget.show()

3)QGridLayout (网格布局)

QGridLayout 是一个网格布局管理器,控件被排列在一个网格中,类似于表格。

from PyQt6.QtWidgets import QWidget, QGridLayout, QPushButton

widget = QWidget()
layout = QGridLayout() layout.addWidget(QPushButton('Button 1'), 0, 0)
layout.addWidget(QPushButton('Button 2'), 0, 1)
layout.addWidget(QPushButton('Button 3'), 1, 0) widget.setLayout(layout)
widget.show()

PyQt6 中,类似于 wxPythonGridBagSizer,即可以让控件跨行和跨列的布局功能,通常通过使用 QGridLayout 来实现。QGridLayout 允许你指定控件的位置和它们所占的行列范围,从而实现跨行和跨列的布局。

QGridLayout 是 PyQt6 中的网格布局管理器,它允许控件按行列排列,你可以通过指定控件所在的行和列来控制它们的位置。如果需要让控件跨越多个行或列,可以通过设置控件的 rowSpancolumnSpan 来实现。

# 添加控件,指定位置 (行, 列) 以及跨越的行和列
layout.addWidget(QPushButton('Button 1'), 0, 0) # 第 1 个按钮
layout.addWidget(QPushButton('Button 2'), 0, 1) # 第 2 个按钮
layout.addWidget(QPushButton('Button 3'), 1, 0, 1, 2) # 第 3 个按钮跨越 1 行 2 列

你还可以根据需求自由配置控件在 QGridLayout 中的位置,包括:

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

4)QFormLayout (表单布局)

QFormLayout 用于创建一个表单式的布局,控件和标签按“标签-控件”对的形式排列。

from PyQt6.QtWidgets import QWidget, QFormLayout, QLabel, QLineEdit

widget = QWidget()
layout = QFormLayout() layout.addRow(QLabel('Name:'), QLineEdit())
layout.addRow(QLabel('Age:'), QLineEdit()) widget.setLayout(layout)
widget.show()

5)QStackedLayout (堆叠布局)

QStackedLayout 允许多个控件堆叠在一起,且一次只显示其中一个控件。

from PyQt6.QtWidgets import QWidget, QStackedLayout, QPushButton

widget = QWidget()
layout = QStackedLayout() layout.addWidget(QPushButton('Page 1'))
layout.addWidget(QPushButton('Page 2')) widget.setLayout(layout)
widget.show() # 切换页面
layout.setCurrentIndex(1) # 切换到 Page 2

6)QSplitter (分割器)

QSplitter 允许用户通过拖动分隔条来调整控件的大小。通常用于布局中需要用户可调整分配空间的控件。

from PyQt6.QtWidgets import QWidget, QSplitter, QVBoxLayout, QPushButton
from PyQt6.QtCore import Qt widget = QWidget()
layout = QVBoxLayout() splitter = QSplitter(Qt.Orientation.Horizontal)
splitter.addWidget(QPushButton('Button 1'))
splitter.addWidget(QPushButton('Button 2')) layout.addWidget(splitter)
widget.setLayout(layout)
widget.show()

如果对多个窗口放置在Splitter控件里面, 可以得到如下界面。

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

QBoxLayoutQHBoxLayoutQVBoxLayout 的基类,可以选择水平或垂直方向来排列控件。

from PyQt6.QtWidgets import QWidget, QBoxLayout, QPushButton
from PyQt6.QtCore import Qt widget = QWidget()
layout = QBoxLayout(QBoxLayout.Direction.LeftToRight) layout.addWidget(QPushButton('Button 1'))
layout.addWidget(QPushButton('Button 2')) widget.setLayout(layout)
widget.show()

PyQt6 提供了多种布局管理器,能够灵活地处理不同控件之间的关系。常见的布局管理器包括 QHBoxLayoutQVBoxLayoutQGridLayoutQFormLayout 等。不同的布局管理器适用于不同的场景,帮助开发者更好地控制控件的排列和显示方式。

我整理了以上的代码,并且整合上面所有布局的案例代码在一个界面上,如下所示效果。

而且PyQT6可以通过样式设置一些特别的效果,如下所示。

可以通过setStyle或者 setStyleSheet 函数方式指定不同的界面效果。

if __name__ == '__main__':
app = QApplication(sys.argv) app.setStyle('Fusion') # 设置样式
# app.setStyle('Windows')
# app.setStyle('WindowsVista')
# app.setStyle('Macintosh')
# app.setStyle('GTK')
# app.setStyle('CleanLooks')
# app.setStyle('Plastique') # 设置背景颜色
# app.setStyleSheet("QWidget { background-color: white; }") app.setStyleSheet("""
QPushButton {
background-color: #008CBA;
color: white;
font-size: 16px;
padding: 10px 20px;
border-radius: 5px;
border: 2px solid #006F8C;
} QPushButton:hover {
background-color: #006F8C;
border: 2px solid #008CBA;
} QPushButton:pressed {
background-color: #004F68;
border: 2px solid #006F8C;
}
""") # 创建窗口对象
form = QWidgetExample()
form.show()# 启动应用程序的事件循环
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.FrameQMainWindow 类似,都是用于创建主窗口,QWidget 则是 PyQt6 中的基本窗口组件。
# wxPython
import wx
app = wx.App(False)
frame = wx.Frame(None, wx.ID_ANY, "Hello wxPython")
frame.Show()
app.MainLoop()
# PyQt6
from PyQt6.QtWidgets import QApplication, QMainWindow
app = QApplication([])
window = QMainWindow()
window.setWindowTitle('Hello PyQt6')
window.show()
app.exec()

2) 布局管理

  • wxPython

    • 常用布局管理器有 BoxSizerGridBagSizerGridSizer 等。
  • PyQt6

    • 常用布局管理器有 QVBoxLayoutQHBoxLayoutQGridLayoutQFormLayoutQStackedLayout 等。

    对比:

    • BoxSizer 对应 PyQt6 的 QBoxLayoutQHBoxLayoutQVBoxLayout 是它的具体实现),它们都用于水平或垂直排列控件。
    • GridBagSizer 对应 PyQt6 的 QGridLayout,它允许控件跨行和跨列。
# wxPython
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(wx.Button(frame, label="Button 1"))
sizer.Add(wx.Button(frame, label="Button 2"))
frame.SetSizer(sizer)
# PyQt6
from PyQt6.QtWidgets import QVBoxLayout, QPushButton
layout = QVBoxLayout()
layout.addWidget(QPushButton("Button 1"))
layout.addWidget(QPushButton("Button 2"))
window.setLayout(layout)

上面PyQt6程序截图的案例,我综合了各个PyQT6的各个布局处理,整合在一个窗口里面,代码如下所示。

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QWidget, QToolBar, QStatusBar, QMenuBar, QDialog, QLabel, QLineEdit, QTextEdit, QPushButton
from PyQt6.QtGui import QAction, QIcon # 导入 QIcon 用于设置图标
from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QLayout, QBoxLayout, QHBoxLayout, QVBoxLayout,QGridLayout, QFormLayout, QStackedLayout, QSplitter, QScrollArea, QSizePolicy, QSpacerItem, QSizePolicy, QMessageBox class QWidgetExample(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('QWidget Example') # QBoxLayout
# main_layout = QBoxLayout(QBoxLayout.Direction.LefoRight) # 0
main_layout = QVBoxLayout() #1 btn_widget = QWidget()
layout_btn = QHBoxLayout() #2
layout_btn.addWidget(QPushButton('Button 1'), stretch=1)
layout_btn.addWidget(QPushButton('Button 2'))
btn_widget.setLayout(layout_btn)
main_layout.addWidget(btn_widget) # QGridLayout
grid_widget = QWidget()
layout_grid = QGridLayout() #3
layout_grid.addWidget(QPushButton('Button 1'), 0, 0)
layout_grid.addWidget(QPushButton('Button 2'), 0, 1)
layout_grid.addWidget(QPushButton('Button 3'), 1, 0, 1, 2) # 第 3 个按钮跨越 1 行 2 列
grid_widget.setLayout(layout_grid)
main_layout.addWidget(grid_widget) #form layout
form_widget = QWidget()
layout_form = QFormLayout() #4
layout_form.addRow(QLabel('Name:'), QLineEdit(placeholderText='Enter your name'))
layout_form.addRow(QLabel('Age:'), QLineEdit( text='25', readOnly=True))
layout_form.addRow(QLabel('Note:'), QTextEdit(placeholderText='Enter your note'))
button = QPushButton('Submit')
button.setToolTip('Click to submit')
button.clicked.connect(self.on_button_click)
layout_form.addRow(button)
# 设置字段增长策略,使输入控件可以拉伸
layout_form.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.ExpandingFieldsGrow)
form_widget.setLayout(layout_form)
# 添加到布局中
main_layout.addWidget(form_widget) #stacked layout
stacked_widget = QWidget()
layout_stacked = QStackedLayout() #5
layout_stacked.addWidget(QPushButton('Page 1'))
layout_stacked.addWidget(QPushButton('Page 2'))
# 切换页面
layout_stacked.setCurrentIndex(1) # 切换到 Page 2
stacked_widget.setLayout(layout_stacked)
main_layout.addWidget(stacked_widget) #QSplitter
splitter_widget = QWidget()
layout_splitter = QVBoxLayout()
splitter = QSplitter(Qt.Orientation.Horizontal)
splitter.addWidget(QPushButton('Left'))
splitter.addWidget(QPushButton('Right'))
layout_splitter.addWidget(splitter)
layout_splitter.setStretchFactor(splitter, 1)
splitter_widget.setLayout(layout_splitter)
main_layout.addWidget(splitter_widget) self.setLayout(main_layout) def on_button_click(self):
print('Button clicked') def closeEvent(self, event):
reply = QMessageBox.question(self, 'Message',
"Are you sure to quit?", QMessageBox.StandardButton.Yes |
QMessageBox.StandardButton.No, QMessageBox.StandardButton.No) if reply == QMessageBox.StandardButton.Yes:
event.accept()
else:
event.ignore() if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyle('Fusion') # 设置样式
# 创建窗口对象
form = QWidgetExample()
form.show()# 启动应用程序的事件循环
sys.exit(app.exec())

3) 事件和信号槽机制

  • wxPython

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

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

    对比:

    • 在事件处理上,PyQt6 的信号槽机制比 wxPython 的事件机制更加模块化和松耦合。
# wxPython
button.Bind(wx.EVT_BUTTON, on_button_click)
# PyQt6
button.clicked.connect(on_button_click)

4) 控件和小部件

  • wxPython

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

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

    对比:

    • wx.ButtonQPushButton 类似,wx.TextCtrlQTextEdit 类似,wx.ComboBoxQComboBox 类似。
    • 在 PyQt6 中,控件支持更丰富的样式和自定义,可以通过 QStyleQPainter 进行更精细的绘制。
# wxPython
text_ctrl = wx.TextCtrl(frame)
# PyQt6
text_edit = QTextEdit()

5) 对话框和模态

  • wxPython

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

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

    对比:

    • PyQt6 的对话框和 wxPython 相似,但 exec() 方法在 PyQt6 中表示模态对话框的显示,而在 wxPython 中是 ShowModal()
# wxPython
dialog = wx.MessageDialog(frame, "Hello", "Greeting", wx.OK)
dialog.ShowModal()
# PyQt6
from PyQt6.QtWidgets import QDialog, QVBoxLayout, QPushButton
dialog = QDialog()
layout = QVBoxLayout()
layout.addWidget(QPushButton('OK'))
dialog.setLayout(layout)
dialog.exec()

6) 样式和主题

  • wxPython

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

    • 使用 QSS (Qt Style Sheets) 来自定义控件的外观,类似于 CSS。PyQt6 提供了强大的样式定制能力。

    对比:

    • PyQt6 的样式机制更接近 Web 开发中的 CSS,使用 QSS 使得界面定制更具灵活性和一致性。
# wxPython
frame.SetBackgroundColour(wx.Colour(255, 255, 255))
# PyQt6
app.setStyleSheet("QWidget { background-color: white; }")

3、wxpython中的wx.MessageBox消息对话框,以及打开文件对话框、字体对话框、颜色对话框等常用对话框,如何在PyQT6中实现

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

1) 消息对话框 (QMessageBox)

在 PyQt6 中,你可以使用 QMessageBox 来创建类似于 wx.MessageBox 的消息框。

from PyQt6.QtWidgets import QApplication, QMessageBox, QPushButton

def show_message_box():
app = QApplication([]) # 创建消息对话框
msg = QMessageBox()
msg.setIcon(QMessageBox.Icon.Information) # 设置图标
msg.setText("This is an info message.")
msg.setWindowTitle("Info")
msg.setStandardButtons(QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Cancel) # 显示对话框并获取响应
response = msg.exec()
if response == QMessageBox.StandardButton.Ok:
print("OK clicked")
else:
print("Cancel clicked") app.exec() show_message_box()

2)打开文件对话框 (QFileDialog)

在 PyQt6 中,QFileDialog 用于打开和保存文件,类似于 wxPython 中的 wx.FileDialog

from PyQt6.QtWidgets import QApplication, QFileDialog, QPushButton

def open_file_dialog():
app = QApplication([]) # 创建打开文件对话框
options = QFileDialog.Option.ReadOnly
file_name, _ = QFileDialog.getOpenFileName(None, "Open File", "", "All Files (*)", options=options) if file_name:
print(f"File selected: {file_name}")
else:
print("No file selected") app.exec() open_file_dialog()

3) 字体对话框 (QFontDialog)

QFontDialog 用于选择字体,在 PyQt6 中的使用方式类似于 wxPython 中的 wx.FontDialog

from PyQt6.QtWidgets import QApplication, QFontDialog, QPushButton

def font_dialog():
app = QApplication([]) # 创建字体对话框
font, ok = QFontDialog.getFont() if ok:
print(f"Selected font: {font.family()}, size: {font.pointSize()}")
else:
print("No font selected") app.exec() font_dialog()

4)颜色对话框 (QColorDialog)

QColorDialog 用于选择颜色,类似于 wxPython 中的 wx.ColourDialog

from PyQt6.QtWidgets import QApplication, QColorDialog, QPushButton

def color_dialog():
app = QApplication([]) # 创建颜色对话框
color = QColorDialog.getColor() if color.isValid():
print(f"Selected color: {color.name()}")
else:
print("No color selected") app.exec() color_dialog()

5) 文件保存对话框 (QFileDialog)

保存文件对话框也使用 QFileDialog,通过指定保存选项来实现。

from PyQt6.QtWidgets import QApplication, QFileDialog

def save_file_dialog():
app = QApplication([]) # 创建保存文件对话框
file_name, _ = QFileDialog.getSaveFileName(None, "Save File", "", "Text Files (*.txt);;All Files (*)") if file_name:
print(f"File will be saved as: {file_name}")
else:
print("No file selected for saving") app.exec() save_file_dialog()

在 wxPython 中,可以使用 wx.DirDialog 来选择目录。在 PyQt6 中,QFileDialog 也支持目录选择,只需要指定 FileModeQFileDialog.Directory

from PyQt6.QtWidgets import QApplication, QFileDialog, QPushButton

def directory_dialog():
app = QApplication([]) # 创建选择目录的对话框
directory = QFileDialog.getExistingDirectory(None, "Select Directory") if directory:
print(f"Selected directory: {directory}")
else:
print("No directory selected") app.exec() 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.TextCtrlwx.SpinCtrl或者 wx.SpinCtrlDouble
    (带有上下箭头的数值框)
  • PyQt6: 使用 QSpinBoxQDoubleSpinBox

6)单选框(Radio Button)

  • wxPython: 使用 wx.RadioButton
  • PyQt6: 使用 QRadioButton

wx.RadioBox 是一个带有多个单选按钮的控件,允许用户在多个选项中选择一个。在 PyQt6 中,可以使用 QRadioButtonQButtonGroup 来实现类似的效果。

7) 复选框(Check Box)

  • wxPython: 使用 wx.CheckBox
  • PyQt6: 使用 QCheckBox

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

如果要实现类似FieldSet的效果,如下所示。

代码如下所示

from PyQt6.QtWidgets import QApplication, QWidget, QRadioButton, QCheckBox, QVBoxLayout, QGroupBox, QButtonGroup, QFormLayout
from PyQt6.QtCore import Qt class FieldSetExample(QWidget):
def __init__(self):
super().__init__() self.setWindowTitle("FieldSet Example") # 创建单选按钮
self.radio1 = QRadioButton("Option 1")
self.radio2 = QRadioButton("Option 2") # 创建复选框
self.check1 = QCheckBox("Additional Option 1")
self.check2 = QCheckBox("Additional Option 2") # 创建按钮组以保证单选功能
self.button_group = QButtonGroup(self)
self.button_group.addButton(self.radio1)
self.button_group.addButton(self.radio2) # 创建 QGroupBox 来实现 FieldSet 效果
group_box = QGroupBox("Select Your Options") # 设置标题
layout = QVBoxLayout()
layout.addWidget(self.radio1)
layout.addWidget(self.radio2)
group_box.setLayout(layout) # 创建另一个 QGroupBox 来显示复选框
check_box_group = QGroupBox("Additional Options")
check_layout = QVBoxLayout()
check_layout.addWidget(self.check1)
check_layout.addWidget(self.check2)
check_box_group.setLayout(check_layout) # 设置主布局
main_layout = QFormLayout()
main_layout.addWidget(group_box)
main_layout.addWidget(check_box_group) self.setLayout(main_layout) # 显示窗口
self.show() app = QApplication([])
window = FieldSetExample()
app.exec()

8)下拉列表(ComboBox)

  • wxPython: 使用 wx.ComboBox
  • PyQt6: 使用 QComboBox

QComboBox 中添加自定义对象,如果对象类是 CListItem(Text, Value),可以通过将对象作为 QComboBox 的项来存储。你可以创建一个自定义的类(例如 CListItem),并使用 addItem() 方法将自定义对象添加到 QComboBox 中。

为了将 CListItem 添加到 QComboBox,你需要确保在添加项时使用自定义的文本显示,而在获取选中项时能够正确地获取到对应的 Value

from PyQt6.QtWidgets import QApplication, QWidget, QComboBox, QVBoxLayout
from PyQt6.QtCore import Qt class CListItem:
def __init__(self, text, value):
self.text = text
self.value = value def __repr__(self):
return f"CListItem(text={self.text}, value={self.value})" class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI() def initUI(self):
layout = QVBoxLayout(self) # 创建 QComboBox
combo = QComboBox(self) # 创建自定义对象 CListItem 并添加到 QComboBox
item1 = CListItem("Item 1", 100)
item2 = CListItem("Item 2", 200)
item3 = CListItem("Item 3", 300) # 使用 addItem 添加文本显示的同时存储 CListItem 对象
combo.addItem(item1.text, item1) # item1.text 是显示文本,item1 是存储对象
combo.addItem(item2.text, item2) # item2.text 是显示文本,item2 是存储对象
combo.addItem(item3.text, item3) # item3.text 是显示文本,item3 是存储对象 # 连接槽函数,获取选中的 CListItem 对象
combo.currentIndexChanged.connect(self.on_combobox_changed) # 将 QComboBox 添加到布局中
layout.addWidget(combo)
self.setLayout(layout) def on_combobox_changed(self, index):
# 获取当前选中的 CListItem 对象
combo = self.sender()
item = combo.itemData(index)
if item:
print(f"Selected item: {item} with value {item.value}") app = QApplication([])
window = MyWindow()
window.setWindowTitle("QComboBox with Custom Objects")
window.resize(300, 150)
window.show()
app.exec()

9)树形控件(Tree Control)

  • wxPython: 使用 wx.TreeCtrl
  • PyQt6: 使用 QTreeViewQStandardItemModel

10)图片显示(Image Display)

  • wxPython: 使用 wx.StaticBitmap
  • PyQt6: 使用 QLabelQPixmap

总结

wxPython 控件 PyQt6 控件 说明
wx.StaticText QLabel 标签
wx.TextCtrl QLineEdit 单行文本框
wx.TextCtrl (multiline) QTextEdit 多行文本框
wx.adv.DatePickerCtrl QDateEdit 日期选择框
wx.SpinCtrl QSpinBox, QDoubleSpinBox 数值输入框
wx.RadioButton QRadioButton 单选框
wx.CheckBox QCheckBox 复选框
wx.ComboBox QComboBox 下拉列表
wx.TreeCtrl QTreeView, QStandardItemModel 树形控件
wx.StaticBitmap QLabel with QPixmap 图片显示

通过这些对比,你可以更容易地在 PyQt6 中找到对应的控件,并使用相似的方式构建用户界面。

一问一答学习PyQT6,对比WxPython和PyQt6的差异的更多相关文章

  1. OpenGL快问快答

    OpenGL快问快答 本文内容主要来自对(http://www.opengl.org/wiki/FAQ)的翻译,随机加入了本人的观点.与原文相比,章节未必完整,含义未必雷同,顺序未必一致.仅供参考. ...

  2. Vue.js 一问一答

    Vue.js 一问一答 记录一下在学习 Vue 过程中给自己问的一些问题,持续更新中... Vue.js 的核心是什么? 官网:Vue.js 的核心是一个允许采用简洁的模板语法来声明式的将数据渲染进 ...

  3. Oracle百问百答(四)

    Oracle百问百答(四) 31.怎样查看某用户下的表? select table_name from all_tables where owner=upper('jhemr'); 32.怎样查看某用 ...

  4. Oracle百问百答(二)

    Oracle百问百答(二) 11. nvl函数有什么用? NVL( string1, replace_with) 功能:如果string1为NULL,则NVL函数返回replace_with的值,否则 ...

  5. Oracle百问百答(一)

    Oracle百问百答(一) 01.如何查看oracle的版本信息? 02.如何查看系统被锁的事务信息? 03.怎么获取有哪些用户在使用数据库? 04. 数据表中的字段最大数是多少? 表或视图中的最大列 ...

  6. 微信小程序参数二维码6问6答

    微信小程序参数二维码[基础知识篇],从6个常见问题了解小程序参数二维码的入门知识. 1.什么是小程序参数码? 微信小程序参数二维码:针对小程序特定页面,设定相应参数值,用户扫描后进入相应的页面. 2. ...

  7. TensorFlow与主流深度学习框架对比

    引言:AlphaGo在2017年年初化身Master,在弈城和野狐等平台上横扫中日韩围棋高手,取得60连胜,未尝败绩.AlphaGo背后神秘的推动力就是TensorFlow--Google于2015年 ...

  8. k3 Bos开发百问百答

              K/3 BOS开发百问百答   (版本:V1.1)           K3产品市场部       目录 一.基础资料篇__ 1 [摘要]bos基础资料的显示问题_ 1 [摘要]单 ...

  9. Java 面试题问与答:编译时与运行时

    Java 面试题问与答:编译时与运行时 2012/12/17 | 分类: 基础技术, 职业生涯 | 5 条评论 | 标签: RUNTIME, 面试 分享到:58 本文作者: ImportNew - 朱 ...

  10. Python学习笔记:wxPython(GUI图形用户界面)

    wxPython是一套基于Python的第三方GUI插件,可用Python制作丰富的图形化界面程序. 安装:pip install wxPython 或者 网站下载安装https://pypi.org ...

随机推荐

  1. 一个整合性、功能丰富的.NET网络通信框架

    前言 最近有不少同学问:.NET网络通信框架有什么好推荐的吗?今天大姚给大家分享一款基于Apache License开源的一个整合性.功能丰富的.NET(包括 C# .VB.Net.F#)网络通信框架 ...

  2. 锋利的在线诊断工具——Arthas

    导航 前言 火线告警,CPU飚了 服务重启,迅速救火 黑盒:无尽的猜测和不安 Arthas:锋利的Java诊断工具 在线追踪Cpu占比高的代码段 代码重构,星夜上线,稳了 结语 参考 肮脏的代码必须重 ...

  3. SyncOOD:增加OOD目标检测鲁棒性,自动化数据助您一臂之力 | ECCV'24

    本文是对公开论文的核心提炼,而非直接翻译,旨在进行学术交流.如有任何侵权问题,请及时联系号主以便删除. 来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: Can OOD Object Dete ...

  4. isPrimitive:检测数据是不是原始数据

    function isPrimitive(value) { return isStatic(value) || typeof value === 'symbol}

  5. 高性能计算-gemm串行计算优化(3)

    目标:Darknet 源码cpu矩阵乘法函数 gemm_nn 优化.参数说明:lda A的列数; ldb B的列数; ldc C的列数; M C的行数; K A的列数 测试方法:Darknet源码,m ...

  6. python 快速比较大文件的元素异同之处

    0x00 问题 0x01 解决方法 0x02 list最多可以存放多少条数据呢? 0x03 集合set的操作 0x00 问题 假如,在有两个大文件分别存储了大量的数据,数据其实很简单就是一堆字符串,每 ...

  7. ArcGIS遥感影像重采样操作及不同算法对比

      本文介绍在ArcMap软件中,实现栅格图像重采样的具体操作,以及不同重采样方法的选择依据.   在之前的博客中,我们介绍了基于Python中Arcpy模块对栅格图像加以批量重采样的方法:而在Arc ...

  8. elementUI 选择开始结束日期加限制

    需求是开始结束日期不得大于当前时间,当开始日期发生变化时,结束日期不得小于开始日期且不得大于当前日期 <el-form-item label="开始日期:"> < ...

  9. Golang框架之gin

    gin是目前golang的主要web框架之一,之所以选择这个框架是因为其拥有高效的路由性能,并且有人长期维护,目前github上的star数已经破3W. [安装] go get -u github.c ...

  10. Kibana之基本使用

    介绍kibana经常使用的功能 查询: # 查询内容不为空的数据,并返回总数量 GET mp_article/_search?rest_total_hits_as_int=true { "q ...