radio控件设置纵向布局的方法

博客展示了radio的纵向布局代码,给出了具体示例<radio id=\radio1\ layout=\VBox\> ,涉及普元移动平台相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<radio id="radio1" layout="VBox">
import sys from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QRadioButton, QPushButton, QGroupBox, QFileDialog, QLabel, QScrollArea) from PySide6.QtGui import QPixmap, QImage, QPainter from PySide6.QtCore import Qt class PuzzleEditor(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("拼图编辑器") self.resize(800, 600) # ---------------- 初始化选择页控件 ---------------- self.selection_widget = QWidget() # 选择页容器 selection_layout = QVBoxLayout(self.selection_widget) selection_layout.setContentsMargins(50, 50, 50, 50) # 方向选择组 group_box = QGroupBox("请选择排列方向") group_layout = QHBoxLayout(group_box) self.horizontal_radio = QRadioButton("横向排列(左右拼接)") self.vertical_radio = QRadioButton("纵向排列(上下拼接)") self.vertical_radio.setChecked(True) # 默认纵向 group_layout.addWidget(self.horizontal_radio) group_layout.addWidget(self.vertical_radio) selection_layout.addWidget(group_box) # 确认按钮(切换到编辑页) self.confirm_btn = QPushButton("确认并开始编辑") self.confirm_btn.clicked.connect(self.show_editor) selection_layout.addWidget(self.confirm_btn) # ---------------- 初始化编辑页控件 ---------------- self.editor_widget = QWidget() # 编辑页容器 editor_layout = QVBoxLayout(self.editor_widget) # 操作按钮区 button_layout = QHBoxLayout() self.add_btn = QPushButton('添加图片') self.add_btn.clicked.connect(self.add_image) button_layout.addWidget(self.add_btn) self.export_btn = QPushButton('导出拼图') self.export_btn.clicked.connect(self.export_image) self.export_btn.setEnabled(False) # 初始不可用 button_layout.addWidget(self.export_btn) editor_layout.addLayout(button_layout) # 图片显示区(带滚动条) self.scroll_area = QScrollArea() self.scroll_area.setWidgetResizable(True) self.images_container = QWidget() # 图片容器 self.images_layout = QVBoxLayout(self.images_container) # 默认纵向布局 self.images_layout.setAlignment(Qt.AlignTop) self.images_layout.setSpacing(10) self.scroll_area.setWidget(self.images_container) editor_layout.addWidget(self.scroll_area) # ---------------- 初始显示选择页 ---------------- self.setCentralWidget(self.selection_widget) def show_editor(self): """切换到编辑页并设置布局方向""" # 根据选择切换布局 if self.horizontal_radio.isChecked(): # 清空原布局设置横向 self.clear_layout(self.images_layout) self.images_layout = QHBoxLayout(self.images_container) self.images_layout.setAlignment(Qt.AlignLeft) else: # 清空原布局并保持纵向 self.clear_layout(self.images_layout) self.images_layout = QVBoxLayout(self.images_container) self.images_layout.setAlignment(Qt.AlignTop) self.images_layout.setSpacing(10) # 显示编辑页 self.setCentralWidget(self.editor_widget) def clear_layout(self, layout): """清空布局中的控件""" if layout: while layout.count(): item = layout.takeAt(0) widget = item.widget() if widget: widget.deleteLater() def add_image(self): """添加图片到布局""" file_paths, _ = QFileDialog.getOpenFileNames( self, "选择图片", "", "图片文件 (*.png *.jpg *.jpeg *.bmp *.gif)" ) if not file_paths: return for path in file_paths: pixmap = QPixmap(path) if pixmap.isNull(): continue # 跳过无效图片 # 缩放图片(保持比例,最大200x200) scaled_pixmap = pixmap.scaled( 200, 200, Qt.KeepAspectRatio, Qt.SmoothTransformation ) # 创建图片标签并添加到布局 label = QLabel() label.setPixmap(scaled_pixmap) label.setAlignment(Qt.AlignCenter) self.images_layout.addWidget(label) # 添加图片后启用导出按钮 self.export_btn.setEnabled(True) def export_image(self): """导出拼接后的图片(直接合并布局中的图片)""" # 收集所有图片的pixmap pixmaps = [] for i in range(self.images_layout.count()): widget = self.images_layout.itemAt(i).widget() if isinstance(widget, QLabel) and widget.pixmap(): pixmaps.append(widget.pixmap()) if not pixmaps: return # 无图片可导出 # 计算合并后的尺寸(根据布局方向) if isinstance(self.images_layout, QHBoxLayout): # 横向 total_width = sum(p.width() for p in pixmaps) max_height = max(p.height() for p in pixmaps) else: # 纵向 max_width = max(p.width() for p in pixmaps) total_height = sum(p.height() for p in pixmaps) # 创建合并后的图片(直接绘制) if isinstance(self.images_layout, QHBoxLayout): merged_image = QImage(total_width, max_height, QImage.Format_ARGB32) else: merged_image = QImage(max_width, total_height, QImage.Format_ARGB32) merged_image.fill(Qt.white) # 白色背景 painter = QPainter(merged_image) x, y = 0, 0 for pixmap in pixmaps: if isinstance(self.images_layout, QHBoxLayout): # 横向:垂直居中绘制 y = (max_height - pixmap.height()) // 2 painter.drawPixmap(x, y, pixmap) x += pixmap.width() else: # 纵向:水平居中绘制 x = (max_width - pixmap.width()) // 2 painter.drawPixmap(x, y, pixmap) y += pixmap.height() painter.end() # 保存图片 file_path, _ = QFileDialog.getSaveFileName( self, "保存拼图", "", "PNG图片 (*.png);;JPG图片 (*.jpg)" ) if file_path: if not file_path.lower().endswith(('.png', '.jpg')): file_path += '.png' merged_image.save(file_path) if __name__ == "__main__": app = QApplication(sys.argv) window = PuzzleEditor() window.show() sys.exit(app.exec()) 不需要居中绘制
最新发布
07-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值