目录

界面设计总论

导航栏控件需求分析

效果图

代码实现

界面转换成py代码

pyqt5自定义槽函数

信号槽关联

修改代码关联自定义

main函数添加

代码界面分离


网上有些资料通过QT实现导航栏的,本文通过designer 设计,通过pyqt运行实现导航栏。

涉及到pyqt及 designer的安装部分,请参考前文: (12条消息) eric+pyqt5的安装_proware的博客-CSDN博客

界面设计总论

采用designer或者其他软件进行界面设计时的一般思路:

1) 首先创建一块空白的画布。在designer里面即为创建一个新的main windows窗口。

2)需要对这个画布或者讲 main windows进行区域分割。

3)如果有必要,进一步对区域进行细分分割。

4)在每个区域上部署功能控件。

导航栏控件需求分析

1)  以vmware虚拟机配置为例子:左侧为一个列表;右侧为每个列表项对应的内容。

那么对应到designer里面,如何选取控件?首先我们要清楚,此时进行到界面设计的第二步,即区域的分割,在designer中,区域分割通过以下几个控件来实现,这里被统称为“containters”即容器类,也就是容纳其他控件的区域。

2)对于导航栏右侧,需要由多个frame来实现,每个对应左侧一个列表项,因而我们采用stacked widget这个控件,这个控件即为多个frame或者widget 堆叠在一起,通过 索引号可以控制切换到哪一层的frame

3)对于导航栏左侧,用一个frame或者widget,然后往此frame或者widget里面添加button实现。

更简单地,则采用list widget这个控件。

4) 每个区域的功能控件,则根据需要添加

效果图

最终我们做出一个效果图:

此时仅仅为视图层并不能实现 左侧导航,右侧跟着变动的情况。我们还需要添加代码实现控制层。

代码实现

代码功能比较简单:

即针对list widget的  currentRowChanged 信号 实现切换 stack widgets

界面转换成py代码

网上资料较多,此处不再赘述,即通过pyuic工具,笔者已经将工具添加到pycharm中的extern tools,这样可以直接对UI文件右键,选择此工具进行转换。

extern tools 针对pyuic5的配置详细配置如下:
Program: 对应pyuic5.exe的绝对
Arguments: $FileName$ -o $FileNameWithoutExtension$.py
Working directory: $FileDir$

pyqt5自定义槽函数

信号槽关联

在目前安装的pyqt5-tools里面带的designer 里面,并没有直接添加自定义槽函数的地方。需要添加一个默认的后修改代码。

通过按钮,讲designer从设计界面切换到 信号、槽的编辑界面,然后针对list widget添加,添加后在右下角的信号/槽编辑器可以看到:

修改代码关联自定义

找到转换后的py代码,修改其中信号、槽的关联

self.dev_class.currentRowChanged['int'].connect(self.change_cfg_class)

切换 stack的自定义槽函数如下,在这里index即为  currentRowChanged信号所在的值,这里隐式的表现了信号和槽 两个模块间的参数传递,在自定义槽函数的时候一定要注意。

    def change_cfg_class(self,index):self.stackedWidget.setCurrentIndex(index)

至此,主题的界面及简单的控制已经实现了。

main函数添加

转换后的py文件,仅仅一个窗体类,并不能运行,为了使此窗体能运行,我们需要添加main入口。

import sys
if __name__ == '__main__':app = QtWidgets.QApplication(sys.argv)MainWindow = QtWidgets.QMainWindow()ui = Ui_MainWindow()  #界面生成的窗体类ui.setupUi(MainWindow)MainWindow.show()sys.exit(app.exec_())

此时,直接python   xxx.py(即UI转换后的py文件)文件即可以运行。并实现通过左侧导航栏到右侧界面的切换。

代码界面分离

行文到此时,我们的代码都是在 pyuic转换后的py文件进行修改的,如果我们重新调整界面,此时需要重新生成py文件,那么我们的修改就被冲掉了!!

因而,我们基于生成的界面类,实现自己的代码,不改动界面生成的py文件。

import sys
from cfg_new import Ui_MainWindow
from PyQt5 import QtCore, QtGui, QtWidgetsclass Cfg_UI(Ui_MainWindow):def connect_slot(self):self.dev_class.currentRowChanged['int'].connect(self.change_cfg_class)def change_cfg_class(self,index):self.stackedWidget.setCurrentIndex(index)if __name__ == '__main__':app = QtWidgets.QApplication(sys.argv)MainWindow = QtWidgets.QMainWindow()ui = Cfg_UI()ui.setupUi(MainWindow)MainWindow.show()sys.exit(app.exec_())

pyqt5实现导航栏相关推荐

  1. 修改vue-element-admin左侧导航栏的图标

    vue-element-admin一个基于 vue2.0 和 Eelement 的控制面板 UI 框架,这是使用vue技术栈开发的前端程序员的首选管理系统模板,模板以及非常的成熟了,并且有相关的社区和 ...

  2. CSS3——对齐 组合选择符 伪类 伪元素 导航栏 下拉菜单

     水平&垂直对齐 元素居中对齐 .center {margin: auto;width: 50%;border: 3px solid green;padding: 10px; } 文本居中对齐 ...

  3. vue中点击导航栏部分,页面切换

    写页面的时候都会用到一些导航栏.点击不同的部分切换不同的页面.并且点击的时候更换颜色 代码自己简单的写一下:(vue) <nav> <ul><li v-for=" ...

  4. android values-v21 style 报错,Android 4.4 以上实现透明导航栏和状态栏 Translucent system bar...

    第一种方式 第一种方式,需要做下面三步设置 1.在values.values-v19.values-v21的style.xml都设置一个 Translucent System Bar 风格的Theme ...

  5. php zblog 侧边栏样式_zblogphp版如何实现导航栏下拉框

    zblogphp版目前还无任何插件实现导航栏下拉框,根据自己研究和网上的知识,终于研究成功.下面说下实现步骤: 一.在导航条所在模板模板加入更改以下代码 首页{module:navbar} 更改为: ...

  6. mui ios中form表单中点击输入框头部导航栏被推起及ios中form表单中同时存在日期选择及输入框时,日历选择页面错乱bug...

    一.ios header导航栏被推起解决方法 1 设置弹出软键盘时自动改变webview的高度 plus.webview.currentWebview().setStyle({ softinputMo ...

  7. iOS 导航栏遮挡问题 --- iOS开发系列 ---项目中成长的知识七

    不知大家有没有遇见过自己写的tableview被导航栏遮挡住的问题,反正我是遇见过! 因为在ios7以后所有的UIViewController创建后默认就是full Screen的,因此如果带导航栏的 ...

  8. android应用去掉状态栏_Android 显示、隐藏状态栏和导航栏

    Android 显示.隐藏状态栏和导航栏 控制状态栏显示,Activity的主题中配置全屏属性 true 控制状态栏显示,在setContentView之前设置全屏的flag getWindow(). ...

  9. 【bootstrap】如何解决页面缩小后上方导航栏格式变化的问题

    问题描述: bootstrap官方模板中上方导航栏当缩小到一定程度后会发生格式的变化,但我想取消这种变化 页面缩小前: 页面缩小后: 解决方法: 经过阅读bootstrap的css代码后发现了这么一行 ...

最新文章

  1. MindSpore循环神经网络
  2. POJ 1821 Fence ★(单调队列优化DP)
  3. 加载顺序_JAVA类代码块和属性的加载顺序问题,不要以为静态块始终最先执行了!...
  4. 在idea中新建的text文件_开发属于自己的第一款 IDEA 插件!
  5. 基因表达聚类分析之初探SOM
  6. 一统江湖的大前端(5)editorconfig + eslint——你的代码里藏着你的优雅
  7. UnrealEngine4 学习总结备忘
  8. python报“IndentationError: unexpected indent“的解决方法
  9. invalid use of constructor as a template 编译错误
  10. 2016.8.23 项目总结
  11. WebBrowser.ObjectForScripting 属性的使用
  12. ES6-异步async await学习
  13. C语言字母O和数字0怎么区分,车牌数字“0”和字母“O”究竟如何区分?看完终于弄明白了...
  14. matlab tfrstft工具箱,toolbox matlab时间序列分析工具箱 - 下载 - 搜珍网
  15. Android群英传 笔记1 安卓 系统架构和开发工具
  16. LeetCode1175. 质数排列Prime Arrangements
  17. 网络中数据如何保证数据的安全性?
  18. Linux: meld软件使用
  19. vuex 设计思路和实现
  20. 网上书店信息管理系统--基于Mysql数据库与java

热门文章

  1. Git 管理 jmeter 项目
  2. Azure云服务反向DNS
  3. Java中的8种基本和对应的封装类
  4. 【离线安装系列】离线环境下为Ubuntu16.04安装fzf(How to install fzf from source offline)
  5. SDE DPM (随机微分方程导出的diffusion model)
  6. 仿古帆船 穿越时空的爱恋
  7. 【PADS_001】【报错“没有可用的未使用开孔”】
  8. click与dblclick事件冲突解决方法
  9. 心楼:华为运动健康的七年筑造之旅
  10. AWS SAP-C02 专家级认证考试指南