MetaCore-startup/tests/test_card.py
2025-10-11 09:24:06 +08:00

198 lines
5.8 KiB
Python

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QLabel,
QPushButton, QHBoxLayout, QSizePolicy, QFileDialog)
import os
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(100, 100, 1000, 800) # 设置窗口大小
# 使用布局而不是手动定位
layout = QVBoxLayout(self)
layout.setAlignment(Qt.AlignTop)
for i in range(3): # 减少数量便于查看
card = ProjectCard()
layout.addWidget(card)
class ProjectCard(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setObjectName("projectCard")
self.setFixedSize(280, 240)
self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
self.setAttribute(Qt.WA_StyledBackground) # 关键:启用样式背景
self.init_ui()
def init_ui(self):
"""创建网格布局"""
layout = QVBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0)
layout.setSpacing(0)
# 项目头部
self.create_project_header(layout)
# 项目图片
self.create_project_image(layout)
# 项目底部
self.create_project_footer(layout)
def create_project_header(self, layout):
"""创建项目头部"""
header_widget = QWidget()
header_widget.setObjectName("projectHeader")
header_layout = QHBoxLayout(header_widget)
header_layout.setContentsMargins(16, 16, 16, 8)
header_layout.setSpacing(8)
# 项目标题
title_label = QLabel("项目名称")
title_label.setObjectName("projectTitle")
title_label.setWordWrap(True)
header_layout.addWidget(title_label)
# 右侧操作区
actions_layout = QHBoxLayout()
actions_layout.setSpacing(4)
# 菜单按钮
self.menu_btn = QPushButton("")
self.menu_btn.setObjectName("menuBtn")
self.menu_btn.setFixedSize(24, 24)
self.menu_btn.setToolTip("项目操作菜单")
actions_layout.addWidget(self.menu_btn)
header_layout.addLayout(actions_layout)
layout.addWidget(header_widget)
def create_project_image(self, layout):
"""创建项目图片区域"""
image_container = QWidget()
image_container.setObjectName("projectImageContainer")
container_layout = QVBoxLayout(image_container)
container_layout.setContentsMargins(16, 0, 16, 0) # 减少垂直边距
image_widget = QWidget()
image_widget.setObjectName("projectImage")
image_layout = QVBoxLayout(image_widget)
image_layout.setAlignment(Qt.AlignCenter)
image_layout.setContentsMargins(0, 0, 0, 0)
image_layout.setSpacing(8)
# 项目图标
icon_label = QLabel("")
icon_label.setObjectName("projectIcon")
icon_label.setAlignment(Qt.AlignCenter)
image_layout.addWidget(icon_label)
container_layout.addWidget(image_widget)
layout.addWidget(image_container, 1) # 添加拉伸因子
def create_project_footer(self, layout):
"""创建项目底部"""
footer_widget = QWidget()
footer_widget.setObjectName("projectFooter")
footer_layout = QVBoxLayout(footer_widget)
footer_layout.setContentsMargins(16, 8, 16, 16)
# 项目日期
date_label = QLabel("2025年8月6日")
date_label.setObjectName("projectDate")
date_label.setAlignment(Qt.AlignCenter)
footer_layout.addWidget(date_label)
layout.addWidget(footer_widget)
class StyleSheet:
@staticmethod
def get_main_style():
return """
/* 基础卡片样式 - 修复继承问题 */
#projectCard {
background-color: #8b5cf6;
border: 1px solid #5a5a6a;
border-radius: 16px;
}
/* 简化悬停状态 */
#projectCard:hover {
background-color: #7c3aed;
border-color: #6a6a7a;
}
/* 头部样式 - 移除透明背景 */
#projectHeader {
background-color: #8b5cf6;
border-top-left-radius: 16px;
border-top-right-radius: 16px;
}
#projectTitle {
font-size: 14px;
font-weight: 600;
color: #ffffff;
background-color: transparent;
}
#menuBtn {
background-color: transparent;
border: none;
border-radius: 4px;
color: #ffffff;
font-size: 16px;
}
#menuBtn:hover {
background-color: rgba(255, 255, 255, 0.2);
}
/* 图片区域样式 - 调整尺寸和边距 */
#projectImageContainer {
background-color: transparent;
padding: 0px; /* 减少内边距 */
}
#projectImage {
background-color: #3a3a4a;
border-radius: 12px;
min-height: 100px; /* 减小最小高度 */
max-height: 120px;
}
#projectIcon {
font-size: 36px; /* 减小图标大小 */
color: #ffffff;
padding: 10px;
}
/* 底部样式 - 移除透明背景 */
#projectFooter {
background-color: #8b5cf6;
border-bottom-left-radius: 16px;
border-bottom-right-radius: 16px;
}
#projectDate {
font-size: 11px;
color: #e0e0ff; /* 更亮的颜色提高可读性 */
font-weight: 400;
background-color: transparent;
}
"""
if __name__ == "__main__":
app = QApplication(sys.argv)
app.setStyleSheet(StyleSheet.get_main_style())
w = MainWindow()
w.show()
app.exec_()