示例#1
0
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)
示例#2
0
 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;
     }
     """)
示例#3
0
 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;
     }
     """)
示例#4
0
 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()
示例#5
0
 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);
     }
     """)
示例#6
0
 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)
     }
     """)
示例#7
0
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)
示例#8
0
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)
示例#9
0
    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; /*整个外边框*/
        }
        """)
示例#10
0
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)
示例#11
0
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)