python-pyQt5: 界面布局,实现可视化图片、视频处理工具

python-pyQt5: 界面布局,实现可视化图片、视频处理工具,第1张

PGVA,我自己取名的小工具,用来处理合成、视频截取等小功能,方便处理和视频。

主要界面布局排版和布局

该软件有5块部分组成, 左边的每个按钮点开是单独的一个个QWidget窗体,右边是一个堆叠布局。点击左边的功能按钮,切换右边的堆叠布局。

布局图:

左边下方有个垂直布局,这个是用来占位,为了让按钮局上方。

该功能是处理多张合成gif动图

合成输出和合成 这个区域处理起来有点麻烦,

这里是表单布局,两行,第二行的标题部分是空串;下方的”合成“区域用一样的处理方式。控件先存到表单布局中,然后再依次放入垂直布局中。

其他功能区域的布局图设计差不多的。

left_place和right_place 这两块是用来占位,为了把 *** 作区域居中。

我给主窗体加了个状态栏,点击状态栏上的图标打开窗口

界面总体的样式

一般窗口的标题栏上有最小化、最大化按钮,用鼠标点击它可以将窗口缩小成图标或最大化到整个屏幕。使用QWidget类的方法也可达到同样的目的:

可用下列函数来获得窗口的状态:

qt 点击按钮调用另一个窗口后,新窗口按钮自定义槽函数不执行,

主窗口按钮的槽函数,点击调用

void Ui_initface::set_clicked()

{

Ui_Dialog udialog;

udialogsetupUi(dialog);

dialog->show();

}

新窗口的槽函数

void Ui_Dialog::save_conf()

{

char s_c[11];

int s_i[8];

memset(s_i,0,8);

QString pstr;

s_i[0]=spinBox0->value();

printf("%d\n",s_i[0]);

s_i[1]=spinBox0_2->value();

pstr=lineEdit_ag->text();

const char c_pstr = pstrtoLatin1()data();

//printf("%s\n",c_pstr);

strcpy(s_c,c_pstr);

s_i[4]=radioButton_ag1->isChecked();

s_i[5]=radioButton_ag01->isChecked();

s_i[2]=radioButton_a1->isChecked ();

s_i[3]=radioButton_01->isChecked ();

s_i[6]=radioButton_ab1->isChecked ();

s_i[7]=radioButton_ab01->isChecked ();

printf("%d\n",s_i[1]);

printf("%d\n",s_i[2]);

printf("%d\n",s_i[3]);

printf("%d\n",s_i[4]);

printf("%d\n",s_i[5]);

printf("%d\n",s_i[6]);

printf("%d\n",s_i[7]);

Write_Config(s_i,s_c);

emit CloseDialog();

}

一、Pyqt5

创建第一个窗体

很多人写窗体程序都是直接敲代码,不使用设计器,我个人不是很赞成这种做法。使用设计器的好处是直观、维护方便,尤其开发复杂窗体的效率高。

但是每次修改ui文件后,需要重新生成py文件,会将原来的内容覆盖掉,为了避免这种情况,引入了一个中间类。主要步骤如下:

1使用QtDesigner创建一个简单的对话框,保存成simpleDialogui。

2使用cmd,进入simpleDialogui文件所在的目录,运行命令pyuic5

simpleDialogui

>ui_simpleDialogpy

3打开ui_simpleDialogpy,pyqt自动生成的代码如下(无需任何修改):

from

PyQt5

import

QtCore,

QtGui,

QtWidgets

class

Ui_Form(object):#注意pyqt5窗体从object继承,不是QMainWindow了

def

setupUi(self,

Form):

FormsetObjectName("Form")

Formresize(400,

300)

selfpushButton

=

QtWidgetsQPushButton(Form)

selfpushButtonsetGeometry(QtCoreQRect(60,

70,

241,

131))

selfpushButtonsetObjectName("pushButton")

selfretranslateUi(Form)

selfpushButtonclickedconnect(Formclose)

QtCoreQMetaObjectconnectSlotsByName(Form)

def

retranslateUi(self,

Form):

_translate

=

QtCoreQCoreApplicationtranslate

FormsetWindowTitle(_translate("Form",

"Form"))

selfpushButtonsetText(_translate("Form",

"PushButton"))

可以看到刚才新建的对话框的类名称是”Ui_Form”。

4新建一个simpleDialogpy文件,编写代码如下:

from

PyQt5

import

QtCore,

QtGui,

QtWidgets

from

ui_simpledialog

import

Ui_Form

import

sys

class

SimpleDialogForm(Ui_Form):#从自动生成的界面类继承

def

__init__(self,

parent

=

None):

super(SimpleDialogForm,

self)__init__()

def

yourFunctions(self):

Pass

 

#这个类中处理你自己的业务逻辑。界面ui可随心所欲的修改,不影响你已经编写的逻辑。

自定义一个类(SimpleDialogForm)继承自pyqt自动生成的类,然后覆写”构造函数”,剩余的工作就是你自己想要添加的功能了。

5完善运行测试代码,如下:

if

__name__

==

"__main__":

app

=

QtWidgetsQApplication(sysargv)

main

=

QtWidgetsQMainWindow()#创建一个主窗体(必须要有一个主窗体)

content

=

SimpleDialogForm()#创建对话框

contentsetupUi(main)#将对话框依附于主窗体

mainshow()#主窗体显示

sysexit(appexec_())

6为什么要这么做?

基于界面与实现分离的原则,我们使用QtDesigner设计的窗体,仅仅作为界面使用,具体业务逻辑通过单独的文件实现,这样以后如果界面发生变动,pyqt自动生成窗体代码时不会覆盖掉我们已经编写的业务逻辑。

7推荐的做法:

为了有良好的封装性,将中间类修改为:

class

SimpleDialogForm(Ui_Form,

QtWidgetsQMainWindow):

def

__init__(self,

parent

=

None):

super(SimpleDialogForm,

self)__init__()

selfsetupUi(self)#在此设置界面

#在此,可添加自定义的信号绑定

selfpushButtonclickedconnect(selfopenFile)

selfpushButton_2clickedconnect(selfcloseApp)

测试代码这样写:

if

__name__

==

"__main__":

app

=

QtWidgetsQApplication(sysargv)

main

=

SimpleDialogForm()

mainshow()#在外面只需要调用simpleDialogForm显示就行,不需要关注内部如何实现了。

sysexit(appexec_())

分割是指将原本参杂交互在一起的模块,按照逻辑分割成不同的模块。分割可以使得各模块的逻辑功能与流程更清晰并且在调整任何一个单一模块时,减少模块间干扰。核心思想很简单,也非常通用,希望以后能避免这一类问题。

比如分割 pyqt5 的 ui 模块与逻辑模块,核心思想是使得 ui 模块和业务逻辑模块分割,优点在于:

实现方法: PyQt5 如何让界面和逻辑分离简介

更详细的一个文档,内容也更多,请参见 Pyqt5系列(二 )-第一个PyQt程序 ,事实上这一个系列都不错,可以看看。

其中,关于 super 的用法,请参见 Python super

这一类的分割思想在其他程序中也有体现。

比如在实现 simulator 函数的生成计划 fn_create_plan 时,主生成的逻辑流程不应受到模拟数据的干扰,而应该与最原始的生成流程完全一致;模拟数据一类的补丁程序应在另外单独的模块中实现,在主流程中调用(隐藏其中),且不影响对主流程的理解。

这是因为,生成计划是一个完整的逻辑模块,补丁程序(覆盖部分数据)是另外一个逻辑模块,两者不应混为一谈。

1、在qtdesigner,在界面空白处右键点击,选择布局->栅格布局可实现控件随窗口大小变化而变化。ctrl+r预览可见。

2、利用pyuic5 将ui文件转化成py文件,运行后发现,控件堆叠挤压在一起。浏览生成的py文件可知gridLayout没有设定大小,可以用setGeometry(QtCoreQRect(,,,,))来设定尺寸参数。

3、在主框架中重写resizeEvent函数,监测窗口变化,同时更改gridLayout的尺寸可实现控件随窗口的变化。

不可以返回流。

pyqt5可以跳转到上一个界面,也可以跳转到下一个界面,不可以返回值。

pyqt5是一套Python绑定DigiaQT5应用的框架。Qt库是最强大的GUI库之一。pyqt5做为Python的一个模块,它有620多个类和6000个函数和方法。这是一个跨平台的工具包,它可以运行在所有主要的 *** 作系统,包括UNIX,Windows,MacOS。

pyqt5是双重许可。开发者可以在GPL和商业许可之间进行选择。

以上就是关于python-pyQt5: 界面布局,实现可视化图片、视频处理工具全部的内容,包括:python-pyQt5: 界面布局,实现可视化图片、视频处理工具、PyQt5编程(10):窗口的最小化与最大化、用的pyqt5,想实现点按钮打开新窗口 【总是报错,实在不知道这个BUG怎么调了,求大佬帮助】等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10097607.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存