PyQt5 中当窗口大小改变时,如何去调整控件的位置以适应窗口大小改变的思考

from PyQt5.Qt import * #刚开始学习可以这样一下导入
import sys,time

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QLineEdit 输出模式的案例")
        self.resize(400,400)
        self.set_ui()
        self.i = 1
    def set_ui(self):
        pass

    def resizeEvent(self, event):

        widget_w = 150
        widget_h = 40
        widget_h_margin = 10
        top_margin = 30

        account_lineEdit = QLineEdit(self)
        account_lineEdit.resize(widget_w,widget_h)

        pwd_lineEdit = QLineEdit(self)
        pwd_lineEdit.resize(widget_w,widget_h)

        btn = QPushButton(self)
        btn.setText("按钮")
        btn.resize(widget_w,widget_h)

        x = (self.width() - widget_w)/2  -self.i
        y1 = top_margin
        y2 = y1 + widget_h +widget_h_margin
        y3 = y2 + widget_h +widget_h_margin

        account_lineEdit.move(x,y1)
        pwd_lineEdit.move(x,y2)
        btn.move(x,y3)

        print(id(btn))
        print(len(self.children()))

        print("===",x,y1,y2,y3)
        print("i = ",self.i)
        self.i +=1

if __name__ == ‘__main__‘:
    app =QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())

from PyQt5.Qt import * #刚开始学习可以这样一下导入
import sys,time

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QLineEdit 输出模式的案例")
        self.resize(400,400)
        self.set_ui()
        self.i = 1
    def set_ui(self):
        self.account_lineEdit = QLineEdit(self)
        self.pwd_lineEdit = QLineEdit(self)
        self.btn = QPushButton(self)

    def resizeEvent(self, event):
        widget_w = 150
        widget_h = 30
        widget_h_margin = 10
        top_margin = 50

        self.account_lineEdit.resize(widget_w,widget_h)

        self.pwd_lineEdit.resize(widget_w,widget_h)

        self.btn.setText("登   录")
        self.btn.resize(widget_w,widget_h)

        x = (self.width() - widget_w)/2
        y1 = top_margin
        y2 = y1 + widget_h +widget_h_margin
        y3 = y2 + widget_h +widget_h_margin

        self.account_lineEdit.move(x,y1)
        self.pwd_lineEdit.move(x,y2)
        self.btn.move(x,y3)

        print(id(self.btn))
        print(len(self.children()))

        print("===",x,y1,y2,y3)
        print("i = ",self.i)
        self.i +=1

if __name__ == ‘__main__‘:
    app =QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())

这两段代码的区别:

第一个是每次改变窗口形状,都会创建新的三个控件,虽然它们在函数的局部作用域内,但是它们不会被内存释放,因为它们的父控件是window

每次都会创建新的控件,但是都没有展示出来,是因为没有采用show() 方法。

总结:

一个对象,没有被释放的原因:

1,它是window 对象的属性

2,它的父控件是window

最后,记住,如果一个后来创建的控件,如果不用show() 它是不会展示出来的。

===============================================================

这个疑问源于当窗口大小改变时,如何去调整控件的位置的问题

它主要是借助于,当每次窗口改变时都会调用resizeEvent() 这个方法!

它应该按后者将三个控件作为对象的属性,这样每次操作的都是同一个控件,而不是去新创建!!!!

顺便提一句:

如何控制窗口的最大和最小,调用setMinsize 和setMaxsize即可(函数名为大概)。

from PyQt5.Qt import * #刚开始学习可以这样一下导入
import sys,time

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QLineEdit 输出模式的案例")
        self.resize(400,400)
        ###########################################################
        self.setMinimumSize(400,400)  # 设置最小尺寸
        self.setMaximumSize(800,800)  # 设置最大尺寸,这时全屏就不能用了

        ###########################################################

        self.set_ui()

    def set_ui(self):
        self.account_lineEdit = QLineEdit(self)
        self.pwd_lineEdit = QLineEdit(self)
        self.btn = QPushButton(self)

    def resizeEvent(self, event):
        widget_w = 150
        widget_h = 30
        widget_h_margin = 10
        top_margin = 50

        self.account_lineEdit.resize(widget_w,widget_h)

        self.pwd_lineEdit.resize(widget_w,widget_h)

        self.btn.setText("登   录")
        self.btn.resize(widget_w,widget_h)

        x = (self.width() - widget_w)/2
        y1 = top_margin
        y2 = y1 + widget_h +widget_h_margin
        y3 = y2 + widget_h +widget_h_margin

        self.account_lineEdit.move(x,y1)
        self.pwd_lineEdit.move(x,y2)
        self.btn.move(x,y3)

if __name__ == ‘__main__‘:
    app =QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())

原文地址:https://www.cnblogs.com/zach0812/p/11373451.html

时间: 2024-10-07 20:43:02

PyQt5 中当窗口大小改变时,如何去调整控件的位置以适应窗口大小改变的思考的相关文章

C# winform中使用Panel调节窗口变化是各控件的位置(转)

我的目的是在窗口上有些控件,在窗口大小变化时,上面的控件位置不动,大小也不动.下面的控件随着窗口的大小变化而变大. 做法是用两个panel,panelTop和panelFill.上面的控件都放到panelTop里面.下面的控件都放到panelFill中. 然后设置PanelTop的Dock属性是Top: 设置panelFill的Dock属性是Fill. 但是总是出现下面的PanelFill把上面的PanelTop覆盖的问题.可以看见实际上下面的控件顶端已经跑到上面的PanelTop那儿去了. 解

ASP.NET中页面加载时文本框(texbox控件)内有文字获得焦点时文字消失

代码如下: <asp:TextBox ID="TextBox1" runat="server" Height="26px" MaxLength="10" Width="166px" Text="请输入用户名" OnFocus="javascript:if(this.value=='请输入用户名') {this.value='';this.style.color='#000

五种情况下会刷新控件状态(刷新所有子FWinControls的显示)——从DFM读取数据时、新增加子控件时、重新创建当前控件的句柄时、设置父控件时、显示状态被改变时

五种情况下会刷新控件状态(刷新控件状态才能刷新所有子FWinControls的显示): 在TWinControls.PaintControls中,对所有FWinControls只是重绘了边框,而没有整个重绘这些FWinControl子控件.那么什么时候才整个重绘全部FWinControls呢?这时候,就不是一个单纯的WM_PAINT来解决控件重绘的问题了,而是这个TWinControl.UpdateShowing函数: procedure TWinControl.UpdateShowing; v

C:\\MFC控件大小随窗体大小而改变

一.大小和位置都改变 1.首先为窗体类添加CRect m_rect,该成员变量用来记录窗体的当前大小. 2.在类向导里面(Ctrl+W),为窗体添加消息WM_SIZE的响应函数OnSize(): 注意if(nType==1) return;这一句必须添加,否则最小化恢复的时候会出错. [cpp]?view plaincopy void?CPaperManagementDlg::OnSize(UINT?nType,?int?cx,?int?cy)??? {?? ????CDialog::OnSiz

c# asp.net 鼠标改变控件坐标位置,更改控件坐标,注册表保存读取,打印,查找局域网内打印机等等收集

界面虽然被我弄的很难看,但功能还可以 里边注册表的路径自己设置一下,或者加一个创建注册表的语句,不然会报错 前台: Html代码   <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="FPSZ.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML

[转]如何在数据绑定时不让combox控件触发SelectedIndexChanged事件

this.cboVendor.SelectedIndexChanged -= new System.EventHandler(this.cboVendor_SelectedIndexChanged); cboVendor.DataSource = myClass.RunQueryCmd(strSqlCmd); cboVendor.DisplayMember = "SupplierCode"; //添加事件 this.cboVendor.SelectedIndexChanged += n

在浏览器中通过bartender,调用条码打印机的active控件代码的实现

系统中需要在浏览器,直接调用条码打印机,打印出产品条码. 现实中的条码打印机,品种繁多,很难在一个程序中实现, 于是我们用已经支持所有条码打印机的bartender软件 调用它的api ,来实现在浏览器中打印条码. 下面是 代码实现: Private Sub UserControl_Initialize() 'On Error Resume Next Dim app1 As BarTender.Application Set app1 = CreateObject("BarTender.Appl

改变FileUpload文件上传控件的显示方式,确认后上传

一.Aspx页面: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FileUploadDemo.aspx.cs" Inherits="WebApplication1.FileUploadDemo" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu

代码中使用bitmap资源并加载到控件上

1.从res/drawable/XX.jpg里引用图片资源: 1. Resources res = getResources(); Bitmap inDrawable= BitmapFactory.decodeResource(res, R.drawable.user_img_grey); userImgButton.setImageBitmap(inDrawable ); 2.从本地sd卡的文件路径中使用图片资源: UserImgPath=Environment.getExternalStor