Expanding Button Bar

本文介绍了一种类似PathApp的弹出按钮效果实现方法,点击主按钮后可弹出更多子按钮,并附带平滑的动画效果。该实现支持ARC编译模式,并已在Xcode4.3及iOS5.0及以上版本中进行测试。
    实现类似Path App的弹出按钮效果。点击主按钮,会弹出更多其他按钮。按钮的弹出和收入动画效果都做得不错。仅支持ARC编译模式。

    Code4App编译测试,测试环境:Xcode 4.3, iOS 5.0 以上。
  • ios Expanding Button Bar
  • ios Expanding Button Bar

转载:http://www.adobex.com/ios/source/details/00000138.htm

转载于:https://my.oschina.net/u/868244/blog/104831

from PyQt6.QtCore import pyqtSignal from PyQt6.QtWidgets import QWidget, QHBoxLayout, QLineEdit, QComboBox, QPushButton, QSpacerItem, QSizePolicy from hr_tools.app.config.style import Style class TopControlBar(QWidget): """顶部控制栏组件""" search_requested = pyqtSignal(str, str, str, str) batch_remind_requested = pyqtSignal() def __init__(self, parent=None): super().__init__(parent) # 设置按钮样式 self.name_input = QLineEdit() self.name_input.setStyleSheet(Style.table_bar_input_style()) self.department_combo = QComboBox() self.department_combo.setStyleSheet(Style.table_bar_select_style()) self.mentor_combo = QComboBox() self.mentor_combo.setStyleSheet(Style.table_bar_select_style()) self.status_combo = QComboBox() self.status_combo.setStyleSheet(Style.table_bar_select_style()) self.search_button = QPushButton("查询") self.search_button.setStyleSheet(Style.table_bar_search_style()) self.batch_remind_button = QPushButton("批量提醒") self.batch_remind_button.setStyleSheet(Style.table_bar_notice_style()) self.init_ui() self.init_connections() def init_ui(self): layout = QHBoxLayout(self) layout.setSpacing(10) layout.setContentsMargins(0, 0, 0, 0) # 名称输入框 self.name_input.setPlaceholderText("请输入名称") self.name_input.setMaximumWidth(100) # 部门下拉框 self.department_combo.addItems(["全部部门", "技术部", "市场部", "财务部", "人力资源部", "行政部"]) self.department_combo.setMaximumWidth(100) # 导师下拉框 self.mentor_combo.addItems(["全部导师", "导师A", "导师B", "导师C"]) self.mentor_combo.setMaximumWidth(100) # 状态下拉框 self.status_combo.addItems(["全部状态", "进行中", "已完成", "已过期"]) self.status_combo.setMaximumWidth(100) # 查询按钮 self.search_button.setFixedWidth(80) # 批量提醒按钮 self.batch_remind_button.setMaximumWidth(100) # 添加控件到布局 layout.addWidget(self.name_input) layout.addWidget(self.department_combo) layout.addWidget(self.mentor_combo) layout.addWidget(self.status_combo) layout.addWidget(self.search_button) # 添加弹性空间 layout.addSpacerItem(QSpacerItem( 20, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum )) layout.addWidget(self.batch_remind_button) def init_connections(self): """初始化信号连接""" self.search_button.clicked.connect(self.emit_search_signal) self.batch_remind_button.clicked.connect(self.batch_remind_requested.emit) def emit_search_signal(self): """发射查询信号""" name = self.name_input.text() dept = self.department_combo.currentText() mentor = self.mentor_combo.currentText() status = self.status_combo.currentText() self.search_requested.emit(name, dept, mentor, status) def apply_styles(self, input_style, select_style, query_style, notice_style): """应用样式表""" self.name_input.setStyleSheet(input_style) self.department_combo.setStyleSheet(select_style) self.mentor_combo.setStyleSheet(select_style) self.status_combo.setStyleSheet(select_style) self.search_button.setStyleSheet(query_style) self.batch_remind_button.setStyleSheet(notice_style) 第一按钮和最后一个按钮就设置间隔, 第一个按钮设置在左侧 最后按钮设置在右侧
最新发布
08-20
from PyQt5.QtWidgets import ( QMainWindow, QVBoxLayout, QWidget, QTableWidget, QTableWidgetItem, QPushButton, QMessageBox, QHeaderView, QLineEdit, QLabel, QFormLayout, QHBoxLayout, QSpacerItem, QSizePolicy ) from PyQt5.QtCore import Qt, QPropertyAnimation, QPoint, QRect from PyQt5.QtGui import QDesktopServices import json import os class PasswordManagerWindow(QMainWindow): def __init__(self, user_id): super().__init__() self.user_id = user_id self.records = [] self.init_ui() self.load_records() def init_ui(self): """初始化界面""" self.setWindowTitle(f"密码管理器 - 用户: {self.user_id}") self.setGeometry(100, 100, 800, 600) # 主布局 central_widget = QWidget() self.setCentralWidget(central_widget) self.main_layout = QVBoxLayout(central_widget) ##t添加按钮 # 添加按钮 (固定在最上方中间) self.add_button = QPushButton("➕") self.add_button.setFixedSize(34, 31) # 正方形按钮 self.add_button.clicked.connect(self.show_add_form) self.add_button.setStyleSheet(''' QPushButton { font-size: 16px; padding: 0px; border - radius: 90px; } ''') self.main_layout.addWidget(self.add_button, alignment=Qt.AlignHCenter) ##退出按钮 self.exit_button = QPushButton("❌") # 创建退出按钮 self.exit_button.setFixedSize(32, 30) # 设置按钮大小(正方形) self.exit_button.clicked.connect(self.close_application) # 连接点击事件 self.exit_button.setStyleSheet(''' QPushButton { font-size: 12px; padding: 0px; margin - right: 10px; border - radius: 90px; } ''') botton_layout = QHBoxLayout() # 新建顶部水平布局 botton_layout.addItem(QSpacerItem(1, 1, QSizePolicy.Expanding, QSizePolicy.Minimum)) botton_layout.addWidget(self.exit_button) # 添加退出按钮 index = self.main_layout.count() # 当前布局中的子布局总数 self.main_layout.insertLayout(index, botton_layout) # 插入到主布局的最顶部 ##退出按钮 # 状态栏容器 (初始隐藏) self.status_bar_container = QWidget() self.status_bar_container.setStyleSheet("background-color: #f0f0f0; border-radius: 5px;") self.status_bar_layout = QFormLayout(self.status_bar_container) # 网站地址输入 self.website_input = QLineEdit() self.status_bar_layout.addRow("网站地址:", self.website_input) # 用户名输入 self.username_input = QLineEdit() self.status_bar_layout.addRow("用户名:", self.username_input) # 密码输入 self.password_input = QLineEdit() self.password_input.setEchoMode(QLineEdit.Password) self.status_bar_layout.addRow("密码:", self.password_input) # 按钮框 self.save_button = QPushButton("保存") self.save_button.clicked.connect(self.save_record) self.cancel_button = QPushButton("取消") self.cancel_button.clicked.connect(self.hide_add_form) button_layout = QVBoxLayout() button_layout.addWidget(self.save_button) button_layout.addWidget(self.cancel_button) self.status_bar_layout.addRow(button_layout) self.main_layout.addWidget(self.status_bar_container) self.status_bar_container.hide() # 初始隐藏 # 表格显示记录 self.table = QTableWidget() self.table.setColumnCount(3) self.table.setHorizontalHeaderLabels(["网站地址", "用户名", "密码"]) self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.table.setEditTriggers(QTableWidget.NoEditTriggers) self.table.doubleClicked.connect(self.on_item_double_clicked) self.main_layout.addWidget(self.table) def close_application(self): self.close() def load_records(self): """从JSON文件加载用户记录""" try: with open("passwords.json", "r", encoding="utf-8") as f: all_records = json.load(f) self.records = [record for record in all_records if record.get("user_id") == self.user_id] self.refresh_table() except FileNotFoundError: QMessageBox.warning(self, "警告", "密码记录文件不存在!") self.records = [] def refresh_table(self): """刷新表格显示""" self.table.setRowCount(len(self.records)) for row, record in enumerate(self.records): website_item = QTableWidgetItem(record.get("website", "")) self.table.setItem(row, 0, website_item) username_item = QTableWidgetItem(record.get("username", "")) self.table.setItem(row, 1, username_item) password_item = QTableWidgetItem("***") password_item.setData(Qt.UserRole, record) self.table.setItem(row, 2, password_item) def show_add_form(self): """显示添加表单(状态栏下滑动画)""" # 重置输入框 self.website_input.clear() self.username_input.clear() self.password_input.clear() # 显示状态栏容器 self.status_bar_container.show() # 执行下滑动画 self.animate_status_bar(show=True) def hide_add_form(self): """隐藏添加表单(状态栏上滑动画)""" self.animate_status_bar(show=False) # 动画完成后隐藏容器 QTimer.singleShot(300, lambda: self.status_bar_container.hide()) def animate_status_bar(self, show=True): """状态栏下滑/上滑动画""" start_pos = QPoint(0, -self.status_bar_container.height()) if show else QPoint(0, 0) end_pos = QPoint(0, 0) if show else QPoint(0, -self.status_bar_container.height()) self.animation = QPropertyAnimation(self.status_bar_container, b"pos") self.animation.setDuration(300) self.animation.setStartValue(start_pos) self.animation.setEndValue(end_pos) self.animation.start() def save_record(self): """保存新记录""" website = self.website_input.text().strip() username = self.username_input.text().strip() password = self.password_input.text().strip() if not website or not username or not password: QMessageBox.warning(self, "警告", "所有字段都必须填写!") return # 创建新记录 new_record = { "user_id": self.user_id, "website": website, "username": username, "password": password } # 添加到记录列表 self.records.append(new_record) # 保存到文件 self.save_records_to_file() # 刷新表格 self.refresh_table() # 隐藏添加表单 self.hide_add_form() def save_records_to_file(self): """保存记录到JSON文件""" try: # 读取所有记录 all_records = [] if os.path.exists("passwords.json"): with open("passwords.json", "r", encoding="utf-8") as f: all_records = json.load(f) # 添加新记录 all_records.append({ "user_id": self.user_id, "website": self.website_input.text().strip(), "username": self.username_input.text().strip(), "password": self.password_input.text().strip() }) # 写入文件 with open("passwords.json", "w", encoding="utf-8") as f: json.dump(all_records, f, indent=4, ensure_ascii=False) except Exception as e: QMessageBox.critical(self, "错误", f"保存记录失败: {str(e)}") def on_item_double_clicked(self, index): """双击表格项事件""" item = self.table.item(index.row(), 0) if item: record = item.data(Qt.UserRole) website = record.get("website", "") if website: QDesktopServices.openUrl(QUrl(website)) # 测试代码 if __name__ == "__main__": from PyQt5.QtWidgets import QApplication from PyQt5.QtCore import QTimer import sys app = QApplication(sys.argv) window = PasswordManagerWindow(user_id="test_user") window.show() sys.exit(app.exec_()) 哪里出了问题?相同记录有三条?
06-09
# 顶部操作区域 top_control_layout = QHBoxLayout() top_control_layout.setSpacing(10) # 设置控件间距为5 top_control_layout.setContentsMargins(0, 0, 0, 0) # 设置边距为0 # 名称输入框 self.name_input = QLineEdit() self.name_input.setStyleSheet(self.input_style()) self.name_input.setObjectName("name_input") self.name_input.setPlaceholderText("请输入名称") self.name_input.setMaximumWidth(100) # 部门下拉框 self.department_combo = QComboBox() self.department_combo.setStyleSheet(self.select_btn_style()) self.department_combo.setObjectName("department_combo") self.department_combo.addItems(["全部部门", "技术部", "市场部", "财务部", "人力资源部", "行政部"]) self.department_combo.setMaximumWidth(100) # 导师下拉框 self.mentor_combo = QComboBox() self.mentor_combo.setStyleSheet(self.select_btn_style()) self.mentor_combo.setObjectName("mentor_combo") self.mentor_combo.addItems(["全部导师", "导师A", "导师B", "导师C"]) self.mentor_combo.setMaximumWidth(100) # 状态下拉框 self.status_combo = QComboBox() self.status_combo.setStyleSheet(self.select_btn_style()) self.status_combo.setObjectName("status_combo") self.status_combo.addItems(["全部状态", "进行中", "已完成", "已过期"]) self.status_combo.setMaximumWidth(100) # 查询按钮 self.search_button = QPushButton("查询") self.search_button.setStyleSheet(self.query_btn_style()) self.search_button.setObjectName("search_button") self.search_button.setFixedWidth(80) # 批量提醒按钮(保持原有顺序) self.batch_remind_button = QPushButton("批量提醒") self.batch_remind_button.setStyleSheet(self.notice_btn_style()) self.batch_remind_button.setObjectName("action-btn") self.batch_remind_button.setMaximumWidth(100) top_control_layout.addWidget(self.name_input) top_control_layout.addWidget(self.department_combo) top_control_layout.addWidget(self.mentor_combo) top_control_layout.addWidget(self.status_combo) top_control_layout.addWidget(self.search_button) # 插入水平弹性空间,将后续控件推至右侧 # 弹性空间推至右侧 top_control_layout.addSpacerItem(QSpacerItem( 20, 20, QSizePolicy.Policy.Expanding, # 水平扩展 QSizePolicy.Policy.Minimum # 垂直保持最小 )) # 添加右对齐按钮 top_control_layout.addWidget(self.batch_remind_button) 单独提取成一个独立的组件
08-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值