class HomePageCollector(QWidget): network_result = pyqtSignal(str) def __init__(self, *args, **kwargs): super(HomePageCollector, self).__init__(*args, **kwargs) layout = QHBoxLayout(margin=0) # 左侧菜单列表 self.left_list = QListWidget(parent=self, clicked=self.left_menu_clicked, objectName='leftList') layout.addWidget(self.left_list, alignment=Qt.AlignLeft) # 右侧显示具体操作窗体 self.operate_frame = LoadedPage() layout.addWidget(self.operate_frame) self.setLayout(layout) self._addListMenu() self.setStyleSheet(""" #leftList::item{ height:22px; } """) # 添加菜单按钮 def _addListMenu(self): # 获取身份证明 user_key = settings.app_dawn.value('UROLE', 0) user_key = pickle.loads(user_key) if user_key <= 3: # 信息管理以上 actions = [u'新闻公告', u'常规报告', u'交易通知', u'现货报表', u'财经日历'] else: actions = [u'常规报告'] for item in actions: self.left_list.addItem(item) # 点击左侧按钮 def left_menu_clicked(self): text = self.left_list.currentItem().text() if text == u'新闻公告': frame_page = NewsBulletinPage(parent=self.operate_frame) frame_page.getNewsBulletins() elif text == u'常规报告': frame_page = NormalReportPage(parent=self.operate_frame) frame_page.getVariety() frame_page.getCurrentReports() elif text == u'交易通知': frame_page = TransactionNoticePage(parent=self.operate_frame) # frame_page.getCategoryCombo() frame_page.getCurrentTransactionNotce() elif text == u'现货报表': frame_page = SpotCommodityPage(parent=self.operate_frame) frame_page.getCurrentSpotCommodity() elif text == u'财经日历': frame_page = FinanceCalendarPage(parent=self.operate_frame) frame_page.getCurrentFinanceCalendar() else: frame_page = QLabel('【' + text + '】正在加紧开发中...') self.operate_frame.clear() self.operate_frame.addWidget(frame_page)
def __init__(self, *args, **kwargs): super(HomePageCollector, self).__init__(*args, **kwargs) layout = QHBoxLayout(margin=0) # 左侧菜单列表 self.left_list = QListWidget(parent=self, clicked=self.left_menu_clicked, objectName='leftList') layout.addWidget(self.left_list, alignment=Qt.AlignLeft) # 右侧显示具体操作窗体 self.operate_frame = LoadedPage() layout.addWidget(self.operate_frame) self.setLayout(layout) self._addListMenu() self.setStyleSheet(""" #leftList::item{ height:22px; } """)
def __init__(self, *args, **kwargs): super(InfoServicePageCollector, self).__init__(*args, **kwargs) layout = QHBoxLayout(margin=0) # 左侧管理菜单 self.left_tree = QTreeWidget(clicked=self.left_tree_clicked, objectName='leftTree') self.left_tree.header().hide() layout.addWidget(self.left_tree, alignment=Qt.AlignLeft) # 右侧显示窗口 self.right_frame = LoadedPage() layout.addWidget(self.right_frame) self.setLayout(layout) self._addLeftTreeContentes() self.setStyleSheet(""" #leftTree::item{ height:22px; } """)
def __init__(self, *args, **kwargs): super(BaseWindow, self).__init__(*args, **kwargs) # self.mousePressed = False # 设置窗体的图标和名称 self.setWindowIcon(QIcon("media/logo.png")) self.setWindowTitle("瑞达期货研究院分析决策系统") # 标题栏 self.title_bar = TitleBar(parent=self) # 导航栏 self.navigation_bar = NavigationBar(parent=self) # 导航栏的信号 self.navigation_bar.clicked_login_button.connect(self.user_to_login) self.navigation_bar.clicked_register_button.connect(self.user_to_register) self.navigation_bar.clicked_logout_button.connect(self.user_to_logout) self.navigation_bar.module_bar.menu_clicked.connect(self.module_clicked) # 选择了某个模块的 self.navigation_bar.permit_bar.to_usercenter.connect(self.skip_to_usercenter) # 跳转至用户中心 # 窗口承载体 self.page_container = LoadedPage(parent=self) # 属性、样式 user_desktop = QDesktopWidget().availableGeometry() # 用户的桌面信息,来改变自身窗体大小 max_width = user_desktop.width() max_height = user_desktop.height() self.resize(max_width * 0.8, max_width * 0.8 * 0.618) self.setMaximumSize(max_width, max_height) # 最大为用户桌面大小 self.setMinimumSize(max_width * 0.5, max_height * 0.5) # 最小为用户桌面大小的一半 my_frame = self.frameGeometry() # 1 (三步法放置桌面中心)自身窗体信息(虚拟框架) my_frame.moveCenter(user_desktop.center()) # 2 框架中心移动到用户桌面中心 self.move(my_frame.topLeft()) # 3 窗口左上角与虚拟框架左上角对齐 self.setWindowFlags(Qt.FramelessWindowHint) # 无边框 self.setAttribute(Qt.WA_TranslucentBackground, True) # 背景全透明(影响子窗口) self._pressed = False self._direction = None self._mouse_pos = None self.setMouseTracking(True) # 鼠标不点下移动依然有效(针对本窗口, 子控件无效) self.title_bar.installEventFilter(self) # 子控件安装事件事件过滤 self.navigation_bar.installEventFilter(self) self.page_container.installEventFilter(self) # 布局 layout = QVBoxLayout(margin=self.MARGIN, spacing=0) layout.addWidget(self.title_bar) layout.addWidget(self.navigation_bar) layout.addWidget(self.page_container) self.setLayout(layout) self.navigation_bar_channel = NavigationBarChannel()
def __init__(self, *args, **kwargs): super(InfoServicePage, self).__init__(*args, **kwargs) layout = QHBoxLayout() layout.setContentsMargins(QMargins(0, 0, 0, 1)) layout.setSpacing(0) self.variety_folded = ScrollFoldedBox(parent=self) self.variety_folded.left_mouse_clicked.connect(self.enter_service) layout.addWidget(self.variety_folded, alignment=Qt.AlignLeft) self.frame = LoadedPage(parent=self) self.frame.remove_borders() layout.addWidget(self.frame) self.setLayout(layout) # 设置折叠窗的样式 self.variety_folded.setFoldedStyleSheet(""" QScrollArea{ border: none; } #foldedBox{ border-right: 1px solid rgb(180, 180, 180); } #foldedHead{ background-color: rgb(145,202,182); border-bottom: 1px solid rgb(200,200,200); border-right: 1px solid rgb(180, 180, 180); max-height: 30px; } #headLabel{ padding:8px 5px; font-weight: bold; font-size: 15px; } #foldedBody{ background-color: rgb(240, 240, 240); border-right: 1px solid rgb(180, 180, 180); } """)
def __init__(self, *args, **kwargs): super(DetailCollector, self).__init__(*args, **kwargs) # 详细页布局 layout = QVBoxLayout(margin=2, spacing=2) message_button_layout = QHBoxLayout(margin=0) font = QFont() font.setFamily('Webdings') self.back_collector_button = QPushButton('r', parent=self, font=font, objectName='closeButton', cursor=Qt.PointingHandCursor) message_button_layout.addWidget(self.back_collector_button, alignment=Qt.AlignLeft) self.network_message_label = QLabel('', parent=self) message_button_layout.addWidget(self.network_message_label) layout.addLayout(message_button_layout) # 下方容器控件 self.collector_container = LoadedPage(parent=self) layout.addWidget(self.collector_container) self.setLayout(layout) self.setAttribute(Qt.WA_StyledBackground, True) # 支持qss设置背景颜色(受父窗口透明影响qss会透明) self.setStyleSheet(""" #closeButton{ border:none; min-width: 20px; max-width: 20px; min-height: 20px; max-height: 20px; background-color: rgb(220, 220, 220) } #closeButton:hover{ background-color: rgb(220, 120, 100) } """)
class InfoServicePageCollector(QWidget): def __init__(self, *args, **kwargs): super(InfoServicePageCollector, self).__init__(*args, **kwargs) layout = QHBoxLayout(margin=0) # 左侧管理菜单 self.left_tree = QTreeWidget(clicked=self.left_tree_clicked, objectName='leftTree') self.left_tree.header().hide() layout.addWidget(self.left_tree, alignment=Qt.AlignLeft) # 右侧显示窗口 self.right_frame = LoadedPage() layout.addWidget(self.right_frame) self.setLayout(layout) self._addLeftTreeContentes() self.setStyleSheet(""" #leftTree::item{ height:22px; } """) # 添加管理菜单 def _addLeftTreeContentes(self): contents = [ { 'name': u'咨询服务', 'subs': [ { 'id': 1, 'name': u'短信通' }, { 'id': 2, 'name': u'市场分析' }, { 'id': 3, 'name': u'专题研究' }, { 'id': 4, 'name': u'调研报告' }, { 'id': 5, 'name': u'市场路演' }, ] }, { 'name': u'顾问服务', 'subs': [ { 'id': 6, 'name': u'人才培养' }, { 'id': 7, 'name': u'部门组建' }, { 'id': 8, 'name': u'制度考核' }, ] }, { 'name': u'策略服务', 'subs': [ { 'id': 9, 'name': u'交易策略' }, { 'id': 10, 'name': u'投资方案' }, { 'id': 11, 'name': u'套保方案' }, ] }, { 'name': u'培训服务', 'subs': [ { 'id': 12, 'name': u'品种介绍' }, { 'id': 13, 'name': u'基本分析' }, { 'id': 14, 'name': u'技术分析' }, { 'id': 15, 'name': u'制度规则' }, { 'id': 16, 'name': u'交易管理' }, { 'id': 17, 'name': u'经验分享' }, ] }, ] # 填充树 for group_item in contents: group = QTreeWidgetItem(self.left_tree) group.setText(0, group_item['name']) # 添加子节点 for variety_item in group_item['subs']: child = QTreeWidgetItem() child.setText(0, variety_item['name']) child.sid = variety_item['id'] group.addChild(child) self.left_tree.expandAll() # 展开所有 # 点击左侧菜单 def left_tree_clicked(self): item = self.left_tree.currentItem() if item.childCount(): # has children open the root if item.isExpanded(): item.setExpanded(False) else: item.setExpanded(True) return service_id = item.sid text = item.text(0) # print(service_id) if service_id == 1: # 短信通 page = MessageServiceMaintain() page.getCurrentSMS() elif service_id == 2: # 市场分析 page = MarketAnalysisMaintain() page.getFileContents() elif service_id == 3: # 专题研究 page = TopicSearchMaintain() page.getFileContents() elif service_id == 4: # 调研报告 page = SearchReportMaintain() page.getFileContents() elif service_id == 6: # 人才培养 page = PersonnelTrainMaintain() elif service_id == 7: # 部门组建 page = DeptBuildMaintain() elif service_id == 8: # 制度考核 page = InstExamineMaintain() elif service_id == 9: # 交易策略 page = TradePolicyMaintain() elif service_id == 10: # 投资方案 page = InvestPlanMaintain() page.getFileContents() elif service_id == 11: # 套保方案 page = HedgePlanMaintain() page.getFileContents() elif service_id == 12: # 培训服务-品种介绍 page = VarietyIntroMaintain() else: page = QLabel( '【' + text + '】还不能进行数据管理...', styleSheet= 'color:rgb(50,180,100); font-size:15px;font-weight:bold', alignment=Qt.AlignCenter) self.right_frame.clear() self.right_frame.addWidget(page)
class BaseWindow(QWidget): # 枚举左上右下以及四个定点 Left, Top, Right, Bottom, LeftTop, RightTop, LeftBottom, RightBottom = range(8) MARGIN = 5 # 边缘宽度小用于调整窗口大小 def __init__(self, *args, **kwargs): super(BaseWindow, self).__init__(*args, **kwargs) # self.mousePressed = False # 设置窗体的图标和名称 self.setWindowIcon(QIcon("media/logo.png")) self.setWindowTitle("瑞达期货研究院分析决策系统") # 标题栏 self.title_bar = TitleBar(parent=self) # 导航栏 self.navigation_bar = NavigationBar(parent=self) # 导航栏的信号 self.navigation_bar.clicked_login_button.connect(self.user_to_login) self.navigation_bar.clicked_register_button.connect(self.user_to_register) self.navigation_bar.clicked_logout_button.connect(self.user_to_logout) self.navigation_bar.module_bar.menu_clicked.connect(self.module_clicked) # 选择了某个模块的 self.navigation_bar.permit_bar.to_usercenter.connect(self.skip_to_usercenter) # 跳转至用户中心 # 窗口承载体 self.page_container = LoadedPage(parent=self) # 属性、样式 user_desktop = QDesktopWidget().availableGeometry() # 用户的桌面信息,来改变自身窗体大小 max_width = user_desktop.width() max_height = user_desktop.height() self.resize(max_width * 0.8, max_width * 0.8 * 0.618) self.setMaximumSize(max_width, max_height) # 最大为用户桌面大小 self.setMinimumSize(max_width * 0.5, max_height * 0.5) # 最小为用户桌面大小的一半 my_frame = self.frameGeometry() # 1 (三步法放置桌面中心)自身窗体信息(虚拟框架) my_frame.moveCenter(user_desktop.center()) # 2 框架中心移动到用户桌面中心 self.move(my_frame.topLeft()) # 3 窗口左上角与虚拟框架左上角对齐 self.setWindowFlags(Qt.FramelessWindowHint) # 无边框 self.setAttribute(Qt.WA_TranslucentBackground, True) # 背景全透明(影响子窗口) self._pressed = False self._direction = None self._mouse_pos = None self.setMouseTracking(True) # 鼠标不点下移动依然有效(针对本窗口, 子控件无效) self.title_bar.installEventFilter(self) # 子控件安装事件事件过滤 self.navigation_bar.installEventFilter(self) self.page_container.installEventFilter(self) # 布局 layout = QVBoxLayout(margin=self.MARGIN, spacing=0) layout.addWidget(self.title_bar) layout.addWidget(self.navigation_bar) layout.addWidget(self.page_container) self.setLayout(layout) self.navigation_bar_channel = NavigationBarChannel() def close(self): super(BaseWindow, self).close() # 清理缓存目录 cache_path = os.path.join(BASE_DIR, 'cache/') shutil.rmtree(cache_path) def show(self): super(BaseWindow, self).show() # 创建缓存目录 cache_path = os.path.join(BASE_DIR, 'cache/') if not os.path.exists(cache_path): os.mkdir(cache_path) # 用户点击【登录】 def user_to_login(self): from popup.base import LoginPopup login_popup = LoginPopup(parent=self) login_popup.user_listed.connect(self.user_login_successfully) if not login_popup.exec_(): login_popup.deleteLater() del login_popup # 启动自动登录 def running_auto_login(self): if settings.app_dawn.value('auto') == '1': # 自动登录 token = settings.app_dawn.value('AUTHORIZATION') if not token: self.user_to_login() return try: r = requests.get( url=settings.SERVER_ADDR + 'login/?utoken=' + token, ) response = json.loads(r.content.decode('utf-8')) if r.status_code != 200: raise ValueError(response['message']) except Exception: settings.app_dawn.remove('AUTHORIZATION') # 状态保持失败移除token self.user_to_login() return # 自动登录失败 else: # print(response) if response['user_data']: self.user_login_successfully(response['user_data']) else: # 删除token settings.app_dawn.remove('AUTHORIZATION') # 用户登录成功(注册成功) def user_login_successfully(self, response_data): # 保存token token = response_data['utoken'] settings.app_dawn.setValue('UROLE', pickle.dumps(response_data['role_num'])) settings.app_dawn.setValue('UKEY', pickle.dumps(response_data['id'])) # token的处理 settings.app_dawn.setValue('AUTHORIZATION', token) # 发送token到网页页面 self.navigation_bar_channel.userHasLogin.emit(token) # 组织滚动显示用户名 dynamic_username = response_data['username'] if not response_data['username']: phone = response_data['phone'] dynamic_username = phone[0:3] + '****' + phone[7:11] # 设置头像 if response_data['avatar']: avatar_url = settings.SERVER_ADDR[:-1] + response_data['avatar'] self.navigation_bar.permit_bar.setAvatar(avatar_url) # 改变显示用户名 self.navigation_bar.permit_bar.show_username(dynamic_username) # 设置用户id self.navigation_bar.permit_bar.set_user_id(response_data['id']) # 菜单 modules = self.get_system_modules() self.navigation_bar.module_bar.setMenus(modules) # 请求菜单项 def get_system_modules(self): try: r = requests.get( url=settings.SERVER_ADDR + 'module/', headers={'Content-Type':'application/json;charset=utf8'}, data=json.dumps({ 'utoken':settings.app_dawn.value("AUTHORIZATION"), 'machine_code':settings.app_dawn.value("machine") }) ) response = json.loads(r.content.decode('utf8')) if r.status_code != 200: raise ValueError(response['message']) except Exception as e: return [] else: return response['modules'] # 用户点击【注册】 def user_to_register(self): # print('用户点击注册按钮') from popup.base import RegisterPopup register_popup = RegisterPopup(parent=self) register_popup.setAttribute(Qt.WA_DeleteOnClose) register_popup.user_registered.connect(self.user_register_success) register_popup.exec_() # 用户注册成功 def user_register_success(self, userinfo): # 再发起登录 try: r = requests.post( url=settings.SERVER_ADDR + 'login/', headers={'Content-Type': "application/json;charset=utf-8"}, data=json.dumps({ "username": userinfo['username'], "phone": userinfo["phone"], "password": userinfo["password"], "machine_code": settings.app_dawn.value('machine', '') }) ) response = json.loads(r.content.decode('utf8')) if r.status_code != 200: raise ValueError(response["message"]) except Exception as e: tip = InformationPopup(title="提示", message=str(e)) tip.exec_() else: self.user_login_successfully(response['user_data']) # 用户点击【注销】 def user_to_logout(self): if self.navigation_bar.permit_bar.username_shown.isHidden(): return # print('用户点击注销按钮生效') # 清除菜单 self.navigation_bar.module_bar.clear() # 移除token settings.app_dawn.remove('AUTHORIZATION') self.navigation_bar.permit_bar.user_logout() # 注销 # 事件过滤器, 用于解决鼠标进入其它控件后还原为标准鼠标样式 def eventFilter(self, obj, event): if isinstance(event, QEnterEvent): self.setCursor(Qt.ArrowCursor) self._direction = None # 去除方向 self._pressed = None # 去除按下标记 return super(BaseWindow, self).eventFilter(obj, event) # 鼠标按下事件 def mousePressEvent(self, event): super(BaseWindow, self).mousePressEvent(event) if event.button() == Qt.LeftButton: self._mouse_pos = event.pos() self._pressed = True # 鼠标弹起事件 def mouseReleaseEvent(self, event): super(BaseWindow, self).mouseReleaseEvent(event) self._pressed = False self._direction = None # 鼠标移动事件(只有边框MARGIN大小范围有效果,因为其他的是其子控件)(会捕获子控件的鼠标按住移动的事件) def mouseMoveEvent(self, event): super(BaseWindow, self).mouseMoveEvent(event) pos = event.pos() pos_x, pos_y = pos.x(), pos.y() wm, hm = self.width() - self.MARGIN, self.height() - self.MARGIN # print(wm, hm) # 窗口最大无需事件 if self.isMaximized() or self.isFullScreen(): self._direction = None self.setCursor(Qt.ArrowCursor) return if event.buttons() == Qt.LeftButton and self._pressed: self.resize_window(pos) if pos_x <= self.MARGIN and pos_y <= self.MARGIN: # 左上角 self._direction = self.LeftTop self.setCursor(Qt.SizeFDiagCursor) elif wm <= pos_x <= self.width() and hm <= pos_y <= self.height(): # 右下角 self._direction = self.RightBottom self.setCursor(Qt.SizeFDiagCursor) elif wm <= pos_x and pos_y <= self.MARGIN: # 右上角 self._direction = self.RightTop self.setCursor(Qt.SizeBDiagCursor) elif pos_x <= self.MARGIN and hm <= pos_y: # 左下角 self._direction = self.LeftBottom self.setCursor(Qt.SizeBDiagCursor) elif 0 <= pos_x <= self.MARGIN <= pos_y <= hm: # 左边 self._direction = self.Left self.setCursor(Qt.SizeHorCursor) elif wm <= pos_x <= self.width() and self.MARGIN <= pos_y <= hm: # 右边 self._direction = self.Right self.setCursor(Qt.SizeHorCursor) elif wm >= pos_x >= self.MARGIN >= pos_y >= 0: # 上面 self._direction = self.Top self.setCursor(Qt.SizeVerCursor) elif self.MARGIN <= pos_x <= wm and hm <= pos_y <= self.height(): # 下面 self._direction = self.Bottom self.setCursor(Qt.SizeVerCursor) # 由于是全透明背景窗口,重绘事件中绘制透明度为1的难以发现的边框,用于调整窗口大小 def paintEvent(self, event): super(BaseWindow, self).paintEvent(event) painter = QPainter(self) painter.setPen(QPen(QColor(155, 255, 255, 1), 2 * self.MARGIN)) painter.drawRect(self.rect()) # 调整窗口大小 def resize_window(self, pos): if self._direction is None: return mpos = pos - self._mouse_pos xPos, yPos = mpos.x(), mpos.y() geometry = self.geometry() x, y, w, h = geometry.x(), geometry.y(), geometry.width(), geometry.height() if self._direction == self.LeftTop: # 左上角 if w - xPos > self.minimumWidth(): x += xPos w -= xPos if h - yPos > self.minimumHeight(): y += yPos h -= yPos elif self._direction == self.RightBottom: # 右下角 if w + xPos > self.minimumWidth(): w += xPos self._mouse_pos = pos if h + yPos > self.minimumHeight(): h += yPos self._mouse_pos = pos elif self._direction == self.RightTop: # 右上角 if h - yPos > self.minimumHeight(): y += yPos h -= yPos if w + xPos > self.minimumWidth(): w += xPos self._mouse_pos.setX(pos.x()) elif self._direction == self.LeftBottom: # 左下角 if w - xPos > self.minimumWidth(): x += xPos w -= xPos if h + yPos > self.minimumHeight(): h += yPos self._mouse_pos.setY(pos.y()) elif self._direction == self.Left: # 左边 if w - xPos > self.minimumWidth(): x += xPos w -= xPos else: return elif self._direction == self.Right: # 右边 if w + xPos > self.minimumWidth(): w += xPos self._mouse_pos = pos else: return elif self._direction == self.Top: # 上面 if h - yPos > self.minimumHeight(): y += yPos h -= yPos else: return elif self._direction == self.Bottom: # 下面 if h + yPos > self.minimumHeight(): h += yPos self._mouse_pos = pos else: return self.setGeometry(x, y, w, h) # 窗口最大化去除边界MARGIN def showMaximized(self): super(BaseWindow, self).showMaximized() self.layout().setContentsMargins(0, 0, 0, 0) # 还原保留调整大小的边界 def showNormal(self): super(BaseWindow, self).showNormal() self.layout().setContentsMargins(self.MARGIN, self.MARGIN, self.MARGIN, self.MARGIN) # 跳转个人中心 def skip_to_usercenter(self, user_id): self.page_container.clear() page = UserCenter(user_id, parent=self.page_container) page.avatar_changed.connect(self.navigation_bar.permit_bar.setAvatar) page.psd_changed.connect(self.navigation_bar.permit_bar.user_logout) self.page_container.addWidget(page) # 注册交割服务信号通道 def register_delivery_channel(self): """主窗口与交割服务界面的js交互通道""" web_channel = DeliveryChannel() # 交互信号对象 web_channel.hasReceivedUserToken.connect(self.send_token_timer.stop) web_channel.moreCommunicationSig.connect(self.more_communication) # 更多交流讨论 web_channel.linkUsPageSig.connect(self.to_link_us_page) channel_qt_obj = QWebChannel(self.web_show.page()) self.web_show.page().setWebChannel(channel_qt_obj) channel_qt_obj.registerObject("GUIMsgChannel", web_channel) # 注册信号对象 # 点击模块菜单事件(接受到模块的id和模块名称) def module_clicked(self, module_id, module_text): print(module_id, module_text) if module_id == -9: if module_text == u"首页管理": from frame.homepage.homeCollector import HomePageCollector page = HomePageCollector() elif module_text == u"产品服务": from frame.proservice.infoServiceCollector import InfoServicePageCollector page = InfoServicePageCollector() elif module_text == u'基本分析': from frame.basetrend.trendCollector import TrendPageCollector page = TrendPageCollector() # elif module_text == u'交割服务': # from frame.hedging.deliveryCollector import DeliveryPageCollector # page = DeliveryPageCollector(parent=self.page_container) else: page = QLabel(parent=self.page_container, styleSheet='font-size:16px;font-weight:bold;color:rgb(230,50,50)', alignment=Qt.AlignCenter) page.setText("「" + module_text + "-数据管理」暂未开放\n敬请期待,感谢支持~.") else: try: r = requests.get( url=settings.SERVER_ADDR + 'module/' + str(module_id) + '/', headers={'Content-Type': "application/json;charset=utf8"}, data=json.dumps({"utoken":settings.app_dawn.value('AUTHORIZATION')}) ) response = json.loads(r.content.decode('utf-8')) if not response['auth']: raise ValueError("您还没开通这个功能,联系管理员开通。") except Exception as e: # 弹窗提示 info_popup = InformationPopup(parent=self, message=str(e)) info_popup.exec_() return else: # 模块权限验证通过 if module_text == u'首页': from frame.homepage.home import HomePage page = HomePage() page.getCurrentNews() page.getCurrentSliderAdvertisement() page.getFoldedBoxContent() page.folded_box_clicked(category_id=1, head_text='常规报告') # 默认点击常规报告分类id=1 elif module_text == u'产品服务': from frame.proservice.infoService import InfoServicePage page = InfoServicePage() page.addServiceContents() elif module_text == '基本分析': from frame.basetrend.trend import TrendPage page = TrendPage() page.getGroupVarieties() # elif module_text == '交割服务': # from frame.hedging.delivery import DeliveryServicePage # page = DeliveryServicePage(parent=self.page_container, navigation_bar_channel=self.navigation_bar_channel) elif module_text == '计算平台': from frame.formulas.index_page import FormulasCalculate page = FormulasCalculate() page.getGroupVarieties() # elif module_text == '数据管理': # from frame.collector import CollectorMaintain # page = CollectorMaintain(parent=self.page_container) elif module_text == u'运营管理': from frame.operator import OperatorMaintain page = OperatorMaintain(parent=self.page_container) page.addListItem() # 加入管理项目 elif module_text == u'权限管理': from frame.authority import AuthorityMaintain page = AuthorityMaintain(parent=self.page_container) page.getCurrentUsers() else: page = QLabel(parent=self.page_container, styleSheet='font-size:16px;font-weight:bold;color:rgb(230,50,50)', alignment=Qt.AlignCenter) page.setText("「" + module_text + "」暂未开放\n敬请期待,感谢支持~.") self.page_container.clear() self.page_container.addWidget(page)
def __init__(self, *args, **kwargs): super(HomePage, self).__init__(*args, **kwargs) container = QWidget(parent=self) # 页面容器 layout = QVBoxLayout() layout.setContentsMargins(QMargins(0, 1, 0, 1)) layout.setSpacing(1) news_slider_layout = QHBoxLayout(margin=0) # 新闻-轮播布局 news_slider_layout.setSpacing(1) # 新闻公告栏 self.news_box = NewsBox(parent=self) self.news_box.news_item_clicked.connect(self.read_news_item) news_slider_layout.addWidget(self.news_box, alignment=Qt.AlignLeft) # 无新闻公告数据的显示 self.no_data_label = QLabel('暂无相关公告...', styleSheet='color:rgb(200,100,50)', alignment=Qt.AlignCenter) self.no_data_label.hide() news_slider_layout.addWidget(self.no_data_label, alignment=Qt.AlignLeft) # 广告图片轮播栏 self.image_slider = ImageSlider(parent=self) self.image_slider.image_clicked.connect(self.read_advertisement) news_slider_layout.addWidget(self.image_slider) # 无新闻公告数据的显示 self.no_ad_label = QLabel( '广而告之...', styleSheet= 'color:rgb(220, 200, 220);background-color:rgb(120, 160, 160)', alignment=Qt.AlignCenter) news_slider_layout.addWidget(self.no_ad_label) self.no_ad_label.hide() layout.addLayout(news_slider_layout) # 左下角菜单折叠窗 # 菜单-显示窗布局 box_frame_layout = QHBoxLayout(margin=0) box_frame_layout.setSpacing(1) # 菜单滚动折叠窗 self.folded_box = ScrollFoldedBox(parent=self) # self.folded_box.getFoldedBoxMenu() # 初始化获取它的内容再加入布局 self.folded_box.left_mouse_clicked.connect(self.folded_box_clicked) box_frame_layout.addWidget(self.folded_box, alignment=Qt.AlignLeft) # 显示窗 self.frame_window = LoadedPage(parent=self) self.frame_window.remove_borders() box_frame_layout.addWidget(self.frame_window) layout.addLayout(box_frame_layout) container.setLayout(layout) self.setWidget(container) self.setWidgetResizable(True) # 内部控件可随窗口调整大小 self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) # 设置折叠窗的样式 self.folded_box.setFoldedStyleSheet(""" QScrollArea{ border: none; /*整个外边框*/ } #foldedBox{ border-right: 1px solid rgb(180, 180, 180); } #foldedHead{ background-color: rgb(145,202,182); border-bottom: 1px solid rgb(200,200,200); border-right: 1px solid rgb(180, 180, 180); max-height: 30px; } #headLabel{ padding:8px 5px; font-weight: bold; font-size: 15px; } #foldedBody{ background-color: rgb(240, 240, 240); border-right: 1px solid rgb(180, 180, 180); } """) # # 设置滚动条样式 # with open("media/ScrollBar.qss", "rb") as fp: # content = fp.read() # encoding = chardet.detect(content) or {} # content = content.decode(encoding.get("encoding") or "utf-8") # self.setStyleSheet(content) self.setStyleSheet(""" QScrollArea{ border: none; /*整个外边框*/ } """)
class HomePage(QScrollArea): more_news_signal = pyqtSignal(bool) def __init__(self, *args, **kwargs): super(HomePage, self).__init__(*args, **kwargs) container = QWidget(parent=self) # 页面容器 layout = QVBoxLayout() layout.setContentsMargins(QMargins(0, 1, 0, 1)) layout.setSpacing(1) news_slider_layout = QHBoxLayout(margin=0) # 新闻-轮播布局 news_slider_layout.setSpacing(1) # 新闻公告栏 self.news_box = NewsBox(parent=self) self.news_box.news_item_clicked.connect(self.read_news_item) news_slider_layout.addWidget(self.news_box, alignment=Qt.AlignLeft) # 无新闻公告数据的显示 self.no_data_label = QLabel('暂无相关公告...', styleSheet='color:rgb(200,100,50)', alignment=Qt.AlignCenter) self.no_data_label.hide() news_slider_layout.addWidget(self.no_data_label, alignment=Qt.AlignLeft) # 广告图片轮播栏 self.image_slider = ImageSlider(parent=self) self.image_slider.image_clicked.connect(self.read_advertisement) news_slider_layout.addWidget(self.image_slider) # 无新闻公告数据的显示 self.no_ad_label = QLabel( '广而告之...', styleSheet= 'color:rgb(220, 200, 220);background-color:rgb(120, 160, 160)', alignment=Qt.AlignCenter) news_slider_layout.addWidget(self.no_ad_label) self.no_ad_label.hide() layout.addLayout(news_slider_layout) # 左下角菜单折叠窗 # 菜单-显示窗布局 box_frame_layout = QHBoxLayout(margin=0) box_frame_layout.setSpacing(1) # 菜单滚动折叠窗 self.folded_box = ScrollFoldedBox(parent=self) # self.folded_box.getFoldedBoxMenu() # 初始化获取它的内容再加入布局 self.folded_box.left_mouse_clicked.connect(self.folded_box_clicked) box_frame_layout.addWidget(self.folded_box, alignment=Qt.AlignLeft) # 显示窗 self.frame_window = LoadedPage(parent=self) self.frame_window.remove_borders() box_frame_layout.addWidget(self.frame_window) layout.addLayout(box_frame_layout) container.setLayout(layout) self.setWidget(container) self.setWidgetResizable(True) # 内部控件可随窗口调整大小 self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) # 设置折叠窗的样式 self.folded_box.setFoldedStyleSheet(""" QScrollArea{ border: none; /*整个外边框*/ } #foldedBox{ border-right: 1px solid rgb(180, 180, 180); } #foldedHead{ background-color: rgb(145,202,182); border-bottom: 1px solid rgb(200,200,200); border-right: 1px solid rgb(180, 180, 180); max-height: 30px; } #headLabel{ padding:8px 5px; font-weight: bold; font-size: 15px; } #foldedBody{ background-color: rgb(240, 240, 240); border-right: 1px solid rgb(180, 180, 180); } """) # # 设置滚动条样式 # with open("media/ScrollBar.qss", "rb") as fp: # content = fp.read() # encoding = chardet.detect(content) or {} # content = content.decode(encoding.get("encoding") or "utf-8") # self.setStyleSheet(content) self.setStyleSheet(""" QScrollArea{ border: none; /*整个外边框*/ } """) def resizeEvent(self, event): super(HomePage, self).resizeEvent(event) # 控制新闻控件的大小 box_width = self.parent().width() * 0.3 box_height = box_width / 8 * 3 self.news_box.setFixedSize(box_width, box_height) self.no_data_label.setFixedSize(box_width, box_height) # 计算当前控件能容纳的条目数 self.news_box.setItemCount(floor(box_height / 25)) # 控制广告图形的高度 self.image_slider.setFixedHeight(box_height) self.no_ad_label.setMinimumSize(self.parent().width() * 0.7 - 2, box_height) # 控制左下角折叠窗的宽度 self.folded_box.setMinimumWidth(box_width) # 重新设置body的排序数量 self.folded_box.setBodyHorizationItemCount() # 阅读更多新闻 def read_more_news(self): page = MoreNewsPage() self.parent().clear() self.parent().addWidget(page) page.getCurrentNews() # 请求数据 # 阅读一条新闻 def read_news_item(self, title, news_url): file_url = settings.STATIC_PREFIX + news_url popup = PDFContentPopup(title=title, file=file_url) popup.exec_() # 根据当前需求显示获取新闻公告数据 def getCurrentNews(self): try: r = requests.get(url=settings.SERVER_ADDR + 'bulletin/', ) response = json.loads(r.content.decode('utf-8')) if r.status_code != 200: raise ValueError(response['message']) except Exception: pass else: if response['bulletins']: news_list = [ NewsItem(title=news_item['title'], create_time=news_item['create_time'], item_id=news_item['id'], file_url=news_item['file_url']) for news_item in response['bulletins'] ] self.news_box.addItems(news_list) more_button = self.news_box.setMoreNewsButton() more_button.clicked.connect(self.read_more_news) # 阅读更多新闻 self.news_box.show() self.no_data_label.hide() else: self.no_data_label.show() self.news_box.hide() # 获取当前广告轮播数据 def getCurrentSliderAdvertisement(self): ad_files = os.listdir('media/slider') if ad_files: self.image_slider.addImages( ['media/slider/' + path for path in ad_files]) self.image_slider.show() self.no_ad_label.hide() else: self.no_ad_label.show() self.image_slider.hide() # 点击阅读广告 def read_advertisement(self, name): # 请求广告具体数据 file_name = name.rsplit('.', 1)[0] file_addr = settings.STATIC_PREFIX + 'homepage/ad/' + file_name + '.pdf' popup = PDFContentPopup(title='查看内容', file=file_addr, parent=self) popup.exec_() # 添加折叠窗的数据 def getFoldedBoxContent(self): # menus的id需与后端对应 folded_menus = [ { "id": 1, "name": "常规报告", "menus": [ { "id": -1, "name": "全部" }, { "id": 1, "name": "日报" }, { "id": 2, "name": "周报" }, { "id": 3, "name": "月报" }, { "id": 4, "name": "年报" }, { "id": 5, "name": "专题报告" }, { "id": 0, "name": "其他" }, ] }, { "id": 2, "name": "交易通知", "menus": [ { "id": -1, "name": "全部" }, { "id": 1, "name": "公司" }, { "id": 2, "name": "交易所" }, { "id": 3, "name": "系统" }, { "id": 0, "name": "其他" }, ] }, { "id": 3, "name": "现货报表", "menus": [ { "id": -1, "name": "昨日" }, { "id": 0, "name": "今日" }, { "id": 1, "name": "明日" }, ] }, { "id": 4, "name": "财经日历", "menus": [ { "id": -1, "name": "昨日" }, { "id": 0, "name": "今日" }, { "id": 1, "name": "明日" }, ] }, ] for group_item in folded_menus: head = self.folded_box.addHead(group_item['name']) body = self.folded_box.addBody(head=head) for menu_item in group_item['menus']: body.addButton(id=menu_item['id'], name=menu_item['name']) self.folded_box.container.layout().addStretch() # 折叠盒子被点击 def folded_box_clicked(self, category_id, head_text): # print('点击折叠盒子', category_id, head_text) # 根据头部text显示窗口 if head_text == u'常规报告': page = NormalReportPage(category_id=category_id, parent=self.frame_window) page.getVarietyCombo() page.getCurrentReports() elif head_text == u'交易通知': page = TransactionNoticePage(category_id=category_id, parent=self.frame_window) page.getCurrentNotices() elif head_text == u'现货报表': page = SpotCommodityPage(delta_days=category_id, parent=self.frame_window) page.getCurrentSpotCommodity() elif head_text == u'财经日历': page = FinanceCalendarPage(delta_days=category_id, parent=self.frame_window) page.getCurrentFinanceCalendar() else: page = QLabel('暂无相关数据...', styleSheet='color:rgb(200,100,50)', alignment=Qt.AlignCenter) self.frame_window.clear() self.frame_window.addWidget(page)
class InfoServicePage(QWidget): def __init__(self, *args, **kwargs): super(InfoServicePage, self).__init__(*args, **kwargs) layout = QHBoxLayout() layout.setContentsMargins(QMargins(0, 0, 0, 1)) layout.setSpacing(0) self.variety_folded = ScrollFoldedBox(parent=self) self.variety_folded.left_mouse_clicked.connect(self.enter_service) layout.addWidget(self.variety_folded, alignment=Qt.AlignLeft) self.frame = LoadedPage(parent=self) self.frame.remove_borders() layout.addWidget(self.frame) self.setLayout(layout) # 设置折叠窗的样式 self.variety_folded.setFoldedStyleSheet(""" QScrollArea{ border: none; } #foldedBox{ border-right: 1px solid rgb(180, 180, 180); } #foldedHead{ background-color: rgb(145,202,182); border-bottom: 1px solid rgb(200,200,200); border-right: 1px solid rgb(180, 180, 180); max-height: 30px; } #headLabel{ padding:8px 5px; font-weight: bold; font-size: 15px; } #foldedBody{ background-color: rgb(240, 240, 240); border-right: 1px solid rgb(180, 180, 180); } """) # 获取所有品种组和品种 def addServiceContents(self): contents = [ { 'name': u'咨询服务', 'subs': [ { 'id': 1, 'name': u'短信通' }, { 'id': 2, 'name': u'市场分析' }, { 'id': 3, 'name': u'专题研究' }, { 'id': 4, 'name': u'调研报告' }, { 'id': 5, 'name': u'市场路演' }, ] }, { 'name': u'顾问服务', 'subs': [ { 'id': 6, 'name': u'人才培养' }, { 'id': 7, 'name': u'部门组建' }, { 'id': 8, 'name': u'制度考核' }, ] }, { 'name': u'策略服务', 'subs': [ { 'id': 9, 'name': u'交易策略' }, { 'id': 10, 'name': u'投资方案' }, { 'id': 11, 'name': u'套保方案' }, ] }, { 'name': u'培训服务', 'subs': [ { 'id': 12, 'name': u'品种介绍' }, { 'id': 13, 'name': u'基本分析' }, { 'id': 14, 'name': u'技术分析' }, { 'id': 15, 'name': u'制度规则' }, { 'id': 16, 'name': u'交易管理' }, { 'id': 17, 'name': u'经验分享' }, ] }, ] for group_item in contents: head = self.variety_folded.addHead(group_item['name']) body = self.variety_folded.addBody(head=head) for sub_item in group_item['subs']: body.addButton(id=sub_item['id'], name=sub_item['name']) self.variety_folded.container.layout().addStretch() def resizeEvent(self, event): # 设置折叠菜单的大小 folded_width = self.parent().width() * 0.23 self.variety_folded.setFixedWidth(folded_width) self.variety_folded.setBodyHorizationItemCount() # 点击服务,显示页面 def enter_service(self, sid, text): if sid == 1: # 短信通 page = SMSLinkPage(parent=self.frame) page.getSMSContents() elif sid == 2: # 市场分析 page = MarketAnalysisPage(parent=self.frame) page.getCurrentMarketContents() elif sid == 3: # 专题研究 page = TopicSearchPage(parent=self.frame) page.getCurrentTopicContents() elif sid == 4: # 调研报告 page = SearchReportPage(parent=self.frame) page.getCurrentReportContents() elif sid == 6: # 顾问服务-人才培养 page = PDFContentShower(file=settings.STATIC_PREFIX + 'pserver/persontrain/人才培养.pdf', parent=self.frame) elif sid == 7: # 顾问服务-部门组建 page = PDFContentShower(file=settings.STATIC_PREFIX + 'pserver/deptbuild/部门组建.pdf', parent=self.frame) elif sid == 8: # 顾问服务-制度考核 page = PDFContentShower(file=settings.STATIC_PREFIX + 'pserver/rulexamine/制度考核.pdf', parent=self.frame) # elif sid == 9: # 策略服务-交易策略 # page = TradePolicyPage(parent=self.frame) # page.getTradePolicyContents() elif sid == 10: # 策略服务-投资方案 page = InvestPlanPage(parent=self.frame) page.getCurrentPlanContents() elif sid == 11: # 策略服务-套保方案 page = HedgePlanPage(parent=self.frame) page.getCurrentPlanContents() elif sid == 12: # 培训服务-品种介绍 page = PDFContentShower(file=settings.STATIC_PREFIX + 'pserver/varietyintro/品种介绍.pdf', parent=self.frame) else: page = QLabel( '当前模块正在加紧开放...', styleSheet= 'color:rgb(50,180,100); font-size:15px;font-weight:bold', alignment=Qt.AlignCenter) self.frame.clear() self.frame.addWidget(page)