PyQt通过resize改变窗体大小时ListWidget显示异常

  

  前几天开始的pygame音乐播放器Doco,做的差不多了,上午做到了歌词显示和搜索页面.遇到bug,即通过resize改变ui大小时ListWidget显示异常


#目的:

  增加一部分窗口用来显示歌词和搜索页面.也就是在原来播放器的基础上通过resize增加窗口宽度,然后增加相应的内容.

#test

  由于Doco代码过于臃肿,笔者来一个test来描述上午遇到的问题吧.

首先,欲改变ui宽度,则想到resize

Test.resize(852, 714)
#设置高和宽
Test.setFixedSize(852, 714)
#设置调整宽和高

#测试代码:

  来个test的完整代码:

# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file ‘Test.ui‘
#
# Created: Sun Apr  2 21:46:12 2017
#      by: PyQt5 UI code generator 5.2.1
#
# WARNING! All changes made in this file will be lost!

#code by dearvee
import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Test(object):
    def setupUi(self, Test):
        Test.setObjectName("Test")
        Test.resize(852, 714)
        Test.setFixedSize(852, 714)
        self.lineEdit = QtWidgets.QLineEdit(Test)
        self.lineEdit.setGeometry(QtCore.QRect(150, 20, 200, 41))
        self.lineEdit.setObjectName("lineEdit")
        self.listWidget = QtWidgets.QListWidget(Test)
        self.listWidget.setGeometry(QtCore.QRect(0, 140, 420, 421))
        self.listWidget.setObjectName("listWidget")
        self.toolButton = QtWidgets.QToolButton(Test,clicked=lambda:self._resize(Test))
        self.toolButton.setGeometry(QtCore.QRect(0, 20, 41, 41))
        self.toolButton.setObjectName("toolButton")

        self.retranslateUi(Test)
        QtCore.QMetaObject.connectSlotsByName(Test)

    def retranslateUi(self, Test):
        _translate = QtCore.QCoreApplication.translate
        Test.setWindowTitle(_translate("Test", "Test"))
        self.toolButton.setText(_translate("Test", "<"))

    def _resize(self,Test):
        Test.resize(420, 714)#420, 714
        Test.setFixedSize(420, 714)

if __name__ == ‘__main__‘:
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Test()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

现在当点击<按钮,则Test的宽度减少,功能实现.

#运行效果:

#发现bug:

  点击<按钮后宽度变小,但listwidget颜色变成了黑色,当鼠标移入时,恢复正常,这当然不是想要的效果,笔者暂时还不知道造成这种情况的原因所在.

#debug:

  网上粗略的找了一下,没有找到相同问题的解决办法.尝试在<按钮上,增加刷新listwidget事件,成功解决问题.

self.listWidget.clear()#清空list

当然,这里笔者用的listwidget为空表,直接clear即可,如果里面有item,亦刷新即可.

下面debug后完整代码:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file ‘Test.ui‘
#
# Created: Sun Apr  2 21:46:12 2017
#      by: PyQt5 UI code generator 5.2.1
#
# WARNING! All changes made in this file will be lost!

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Test(object):
    def setupUi(self, Test):
        Test.setObjectName("Test")
        Test.resize(852, 714)
        Test.setFixedSize(852, 714)
        self.lineEdit = QtWidgets.QLineEdit(Test)
        self.lineEdit.setGeometry(QtCore.QRect(150, 20, 200, 41))
        self.lineEdit.setObjectName("lineEdit")
        self.listWidget = QtWidgets.QListWidget(Test)
        self.listWidget.setGeometry(QtCore.QRect(0, 140, 420, 421))
        self.listWidget.setObjectName("listWidget")
        self.toolButton = QtWidgets.QToolButton(Test,clicked=lambda:self._resize(Test))
        self.toolButton.setGeometry(QtCore.QRect(0, 20, 41, 41))
        self.toolButton.setObjectName("toolButton")

        self.retranslateUi(Test)
        QtCore.QMetaObject.connectSlotsByName(Test)

    def retranslateUi(self, Test):
        _translate = QtCore.QCoreApplication.translate
        Test.setWindowTitle(_translate("Test", "Test"))
        self.toolButton.setText(_translate("Test", "<"))

    def _resize(self,Test):
        Test.resize(420, 714)#420, 714
        Test.setFixedSize(420, 714)
        self.listWidget.clear()#清空list

if __name__ == ‘__main__‘:
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Test()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

运行此程序,成功解决了问题.

至此,关于上午遇到的 listwidget以resize改变窗体宽度时显示异常问题的解决办法叙述完毕.

来一个音乐播放器Doco的截图,暂时还没有找到合适的素材,有点丑Q_Q:

时间: 2024-11-05 07:10:40

PyQt通过resize改变窗体大小时ListWidget显示异常的相关文章

openGL如何在改变窗口大小时,使自己的图形不被拉伸

这里要注意两个概念:视口和视景体,当视口的纵横比和视景体的纵横比相同的时候,改变窗口大小,图像才不会变形: 视景体是指成像景物所在空间的集合.它是一个空间集合体. 单个的视景体,比如一个球体,若要完全显示,其视景体应该是该球体的最小外接立方体:若要只显示上半部分,则取上半球,其视景体是上半球的最小外接立方体.对于半球而言,上半球是视景体,那么其只有上半球有显示权限,下半球没有,所以就算是将该球体位置拉远,也只能看到上半球. 若视景体仅仅为上半球,那么默认情况下,上半球所映射的画布刚好充满摄像机.

delphi SetWindowPos改变窗体位置和状态

http://blog.163.com/[email protected]/blog/static/1730690722012534428814/ delphi SetWindowPos改变窗体位置和状态 2012-06-03 16:04:28|  分类: 电脑|举报|字号 订阅 下载LOFTER我的照片书  | //声明:SetWindowPos(hWnd: HWND;            {窗口句柄}hWndInsertAfter: HWND; {窗口的 Z 顺序}X, Y: Intege

PYQT设计无边框窗体

#UI.py,通过UI设计师制作后直接转换为UI.py脚本 # -*- coding: utf-8 -*-from PyQt4 import QtCore, QtGui try:    _fromUtf8 = QtCore.QString.fromUtf8except AttributeError:    _fromUtf8 = lambda s: s class Ui_Form(object):    def setupUi(self, Form):        Form.setObject

改变窗体的大小(理解鼠标的操作事件和过程)

1.Designer.cs代码 namespace 手动改变自制窗体的大小 { partial class Form1 { /// <summary> /// 必需的设计器变量. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// 清理所有正在使用的资源. /// </summary> /// <param name=&

五步教你改变窗体背景色

很多人都在羡慕别人有华丽丽的窗体背景色,为什么自己不能有一个?对!我们也可以有!下面给大家介绍如何修改自己窗体的背景色. 第一步:桌面右键,点击"个性化" 第二步:进入"个性化"以后,点击"窗口颜色" 第三步,进入"窗口颜色"以后,单击"高级外观设置" 第四步:单击"复选框",选择"窗口" 第五步:选择右边上面那个颜色板,如果想要更多颜色,点击"其他...&

打飞机游戏的基本框架:固定窗体位置,不能随意改变窗体大小

package 第五天; import java.awt.Toolkit; import javax.swing.JFrame; public class MainFrame extends JFrame { public MainFrame() { this.setTitle("打飞机框架");//标题 this.setSize(800, 600);//窗体大小 //下面注释的两行代码也可以用来控制窗体显示的位置 // Toolkit tl = Toolkit.getDefaultT

变不可能为可能 - .NET Windows Form 改变窗体类名(Class Name)有多难?续篇

发布<.NET Windows Form 改变窗体类名(Class Name)有多难?>转眼大半年过去了,要不是在前几天有园友对这篇文章进行评论,基本上已经很少关注它了,毕竟那只是一个解惑的研究,在开发中没什么实际的用处.但是由于Squares园友的评论,结合最近自己相关的工作,灵感一现,却真的找到了解决之法,不得不感慨一下,“问题总是会有解决办法的,只是自己能力不够或一时没想到而已”.好了,前奏写完,进入正题. 最近相关工作 最近一段时间,重新拾起以前比较熟悉的界面UI开发,由于需要,了解了

编写一个线程改变窗体的颜色

编写一个线程改变窗体的颜色,1,使用Runnable创建线程,该线程实现窗体的颜色在黑色和白色之间不断的切换.使用内部类创建线程的方式,实现窗口的颜色在黑色和白色之间不断的切换. 一.创建类TestRunnable,继承自JFrame,并实现Runnable接口. 二.覆盖Runable接口的run方法,实现窗体颜色切换,在TestRunnable类中,覆盖Runable类中,覆盖Runnable接口的run方法.在该方法中,首先创建JPanel类的对象panel,并将其放在窗体上:然后,使用w

非主窗体在任务栏显示按钮(简单好用)good

非主窗体在任务栏显示按钮 type TForm2 = class(TForm) private { Private declarations } public { Public declarations } procedure CreateParams(var Params:TCreateParams); override; end; ... procedure TForm2.CreateParams(var Params: TCreateParams); begin inherited Cre