pythonic

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  7 随笔 :: 2 文章 :: 28 评论 :: 58663 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

窗体布局

1使用qtdesigner新建一个对话框,然后拖放几个按钮和文本框,按钮使用水平布局,效果如下:

 

鼠标选中水平布局再选中文本框,进行垂直布局,如下:

 

垂直布局后的效果如下:

 

然后,如何让窗体中的控件随着窗体大小的变化而变化大小呢?这个时候就要用到顶层布局了,使用网格布局,在窗体空白处点击右键,如下:

 

布局后的效果:

 

到此,布局就完成了,试着拖动一下窗体大小,看看里面的控件大小是否随之变化。

 

下面来熟悉一个重要属性:

点击文本框,在属性栏中找到如下属性:

 

水平策略和垂直策略用来表示控件缩放的,说明如下:

Fixed: 当前大小是最合适的,不能改变

Minimum: 当前大小已经是最小, 不能再缩小了, 但可以放大。

Maximum: 当前大小已经是最大, 不能再放大了,但可以缩小。

Preferred:  这个感觉不好用,不会用

Expanding: 可以增大或者缩小。在上面例子中文本框的水平和垂直策略就是expanding

需要注意的问题:在窗体中布局后,打开对象查看器,最顶层的对象不是Form,而是QWidget

 

在我们的界面逻辑类中需要将原来的代码做出相应的修改,如下:

class SimpleDialogForm(Ui_Form, QtWidgets.QMainWindow):改为

class SimpleDialogForm(Ui_Form, QtWidgets.QWidget):

 

2界面设计完成后,需要绑定信号和槽,有两种设计方法,第一种是在qtdesigner中将所有用到的按钮事件全部绑定,然后在界面逻辑类中覆写槽方法。第二种是在QtDesigner中仅将与系统事件相关的信号绑定(比如关闭事件)。在此我们使用第二种方法。

进入信号和槽的编辑界面,操作方法如下:

 

在编辑界面中,点击close按钮,拖动到窗体空白处,弹出的窗体中,选择close事件,此时按钮的click事件就会执行窗体的close方法。

 

到此完成了窗体的设计,还有一个问题

 

使用pyuic5 simpleDialog.py > ui_simpledialog.py 命令完成窗体逻辑类的代码生成。

 

在我们自己编写的窗体逻辑类中,绑定打开和保存的按钮信号,并且覆写窗体的关闭事件,我们需要在窗体关闭时,弹出一个确认对话框。

代码如下:

from PyQt5 import QtCore, QtGui, QtWidgets

from ui_simpledialog import Ui_Form

import sys

import os

import codecs

class SimpleDialogForm(Ui_Form, QtWidgets.QWidget):

    def __init__(self, parent = None):

        super(SimpleDialogForm, self).__init__()

        self.setupUi(self)

        #binding slot

        self.btnOpen.clicked.connect(self.openFile)

        self.btnSaveas.clicked.connect(self.saveasFile)

 

    def openFile(self):

        fd = QtWidgets.QFileDialog(self)

        fileName,filetype = fd.getOpenFileName(caption = "open txt file", directory = 'd:/',filter = "Text Files (*.txt)")

        if os.path.exists(fileName):

            with codecs.open(fileName,"r","utf-8") as f:

                txt = f.read()

                self.textEdit.setText(txt)

            print(filetype)

 

    def saveasFile(self):

        fd = QtWidgets.QFileDialog(self)

        fileName,fileType = fd.getSaveFileName(caption = 'save a file as ', directory = '',filter = "Text Files (*.txt)")

if fileName == '':

return

        with codecs.open(fileName,'w','utf-8') as f:

            f.write(self.textEdit.toPlainText())

        pass

 

    '''override windows close event, we need a query messagebox'''

    def closeEvent(self, event):

        result = QtWidgets.QMessageBox.question(self, "Confirm Exit...",

                            "Are you sure you want to exit ?", QtWidgets.QMessageBox.Yes| QtWidgets.QMessageBox.No)

        event.ignore()

        if result == QtWidgets.QMessageBox.Yes:

            event.accept()

        pass

 

    def yourFunctions(self):

        pass

 

if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)

    main = SimpleDialogForm()

    main.show()

    sys.exit(app.exec_())

 

几处要说明的地方:

1文件的读取写入,一定要指明编码格式。

2文件的操作最好放在with语句块中,完成之后python自动关闭

3浏览对话框的几个参数要记住:

fd.getOpenFileName(caption = "open txt file", directory = 'd:/',filter = "Text Files (*.txt)")

记不住的话就在python idle中使用help命令自己查。

4为了不让自己被编码格式搞蒙,请使用codecs模块(它可以处理现在任意编码的字符)。

 

到此,一个完整的窗体就完成了。

 

其实直接使用example中的例子就行,稍微改改,一个窗体就很完美了。

posted on   pythonic  阅读(2191)  评论(4编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示