在使用MainWindow中的一些技巧
【注意:1)尺寸值不包括标题栏的高度和边框的宽度。2)尺寸和设定的样式有关。不同电脑中可用不同的字体及大小,所以,最好不要使用固定尺寸。 3)由于某些函数的调用会使窗口的尺寸发生变化。】
1。设置窗口最小化和最大化大小:*
self.setMinimumSize(0,0)
self.setMaximumSize(width,height)
setMinimumSize(int w,int h)
setMinimumSize(QSize s) 用鼠标可以让窗口变宽、变高。
setMinimumWidth(int w)
setMinimumHeight(int h)
setMaximumSize(int w,int h)
setMaximumSize(QSize s) 用鼠标可以让窗口变宽、变高。
setMaximumWidth(int w)
setMaximumHeight(int h)
=================================================
"""
showMinimized( )- 最小化;
showMaximized() - 最大化;
showFullscreen() - 窗口全屏显示,不带标题栏和边框。
showNormal() - 回到窗口的原始尺寸。
activateWindow() - 将窗口变为活动窗口。如果窗口是最小化状态,将会恢复到窗口的原始尺寸。
#====设置窗口状态self.setWindowState(Qt.WindowMaximized)======
setwindowState () - 根据Flags值,设置窗口的状态。Flags值可为下列值的组合,这些值来自QtCore.Qt。
windowNoState - 正常状态
windowMinimized - 最小化
windowMaximized - 最大化
windowFullScreen - 全屏显示
windowActive - 活动窗口
可用下列函数来获得窗口的状态:
isMinimized () - 如果窗口最小化,返回值为True;否则,为False;
isMaximized() - 如果窗口最大化,返回值为True;否则,为False;
isFullScreen( ) - 如果窗口全屏显示,返回值为True;否则,为False;
isActiveWindow() - 如果是活动窗口,返回值为True;否则,为False;;
windowstate() - 返回窗口状态的组合值.
"""
2。 设置窗口全屏显示:
self.showMaximized()
3。获得屏幕大小、窗口大小:
要让窗口显示在屏幕中央,就需要知道屏幕的尺寸。
#获得屏幕尺寸
screen = QtGui.QDesktopWidget().screenGeometry()
size = [screen.width(), screen.height()]
self.resize(screen.width(), screen.height())
"""
静态函数QApplication.desktop()来获取代表桌面的QDesktopWidget 对象。再通过调用QDesktopWidget类的函数得到相应值:
width():屏幕宽度的像素值;
height()::屏幕高度的像素值;
screenGeomtry():返回整个屏幕的位置和尺寸的QRect对象;
availableGeomtry():返回屏幕可用区域的位置和尺寸的QRect对象,即扣除任务栏的区域。
"""
desktop = QtWidgets.QApplication.desktop()
x = (desktop.width() - window.width())
y = (desktop.height() - window.height())
#或
desktop = QtWidgets.QApplication.desktop()
x = (desktop.width() - window.frameSize().width())
y = (desktop.height() - window.frameSize().height())
#2、获得窗口尺寸
rect = window.geometry()
print(rect.left(), rect.top())
print(rect.width(), rect.height())
rect = window.frameGeometry()
print(rect.left(), rect.top())
print(rect.width(), rect.height())
"""
geometry():返回包含x,y轴位置以及窗口宽、高的QRect实例;这些值不包括标题栏的高度和边框的宽度。
frameGeometry():返回的参数与geometry()相同,但包括标题栏的高度和边框的宽度且要在显示之后调用才有效。
"""
4。设置窗口显示的左上角坐标、大小,位置等【x,y】:
#设置窗口在屏幕的位置
move(int x,int y)
move(QPoint p)
#窗口的位置是相对于父窗口的位置
setGeometry(int X,int Y,int W,int H) 原点位置左上角。x 轴向右,y轴向下。
setGeometry(QRect r)
setGeometry()可同时设置窗口的位置和尺寸,与move()不同,x,y的值不包括题栏的高度和边框的宽度。所以,如果执行setGeometry(0,0,1000,800),窗口的标题栏和边框在屏幕之外,而无法显示在屏幕上。
#窗口重新设置大小
window.resize(300, 100)
window.move(10, 10)
5。设置窗口样式:self.setWindowFlag(Qt.Window)
使用QWidget类创建的默认窗口有一个标题栏和系统图标,标题栏、最大化按钮、最小化按钮和关闭按钮。调用setWindowsFlags()函数或者在用构造函数创建窗口时设置flags,可改变窗口的类型。setWindowsFlags()的调用要在窗口显示之前。
【引用http://blog.sina.com.cn/s/blog_6483fa330102xkt0.html】
其格式为:setWindowsFlags(Qt.WindowFlags type)
其中Qt.WindowFlags在QtCore.Qt类中定义,包括:
Widget(小工具):QWidget类的默认类型
Window(窗口):QWidget类创建的是窗口,父组件可有可无。有标题栏、最小化、最大化和关闭按钮
Dialog(对话框):有标题栏、帮助和关闭按钮。窗口大小可用鼠标调整。将窗口设置为对话框类型的代码为:window.setWindowsFlags(QtCore.Qt.Dialog)
Sheet和Drawer(表和抽屉):窗口的Mac系统样式
Popup(弹出菜单):窗口表现为弹出菜单样式,没有边框和标题,但有阴影,无法用鼠标调整大小。
Tool(工具栏):窗口表现为工具栏,有边框和比标准窗口标题栏高度小的标题栏和关闭窗口,用鼠标可以调整大小。
ToolTip(提示):窗口表现为帮助提示,没有边框和标题,无法用鼠标调整大小。
SplashScreen(启动窗口):窗口表现为启动窗口,没有边框和标题,无法用鼠标调整大小。是QSplashScreen类的默认值。
Desktop(桌面):窗口表现为桌面,不会在屏幕上显示。
SubWindow(子窗口):窗口表现为子窗口,有边框,标题栏,不能单独存在,也无法用鼠标调整大小。
ForeignWindow(外部窗口):表示窗口为另一进程创建。
CoverWindow(封面窗口):在移动到平台上最小化应用的窗口。
通过windowType()函数可获取当前窗口的类型。在创建窗口时可用“|”运行符一次设置多个属性。下面列出QtCore.Qt常用的一些属性,全面的内容详见文档:
MSWindowsFixedSizeDialogHint - 禁止调整窗口尺寸;
FramelessWindowHint - 去除边框和标题栏;不能调整、移动窗口;
NoDropShadowWindowHint - 去除窗口的阴影;
CustomizeWindowHint - 去除边框和标题栏, 但增加bulk效果,尺寸可调整;
WindowTitleHint - 增加窗口标题;
WindowSystemMenuHint - 增加系统菜单和关闭按钮;
WindowMinimizeButtonHint - 增加最小化按钮;
WindowMaximizeButtonHint - 增加最大化按钮;
WindowMinMaxButtonsHint-增加最小化、最大化按钮;;
WindowCloseButtonHint-增加关闭按钮;
WindowContextHelpButconHint-增加帮助按钮;;
WindowStaysOnTopHint - 将窗口置顶:
WindowStaysOnBottomHint - 将窗口置底。
通过windowFlags()函数可获取当前窗口的属性
6 . 设置窗口大小为固定值:【窗口标题栏上的最大化按钮无效;用鼠标无法调整窗口尺寸】
setFixedSize(int w,int h)
setFixedSize(QSize s)
setFixedWidth(int w)
setFixedHeight(int h)
7。鼠标事件
self.isLeftPressDown = False #鼠标左键是否按下
self.dragPosition=0 #拖动时坐标
self.Numbers = self.enum(UP=0, DOWN=1, LEFT=2, RIGHT=3, LEFTTOP=4, LEFTBOTTOM=5, RIGHTBOTTOM=6, RIGHTTOP=7, NONE=8) #枚举参数
self.setMinimumHeight(500) #窗体最小高度
self.setMinimumWidth(1000) #窗体最小宽度
self.dir=self.Numbers.NONE #初始鼠标状态
self.setMouseTracking(True)
8。 在MainWindow中显示图像的方法
一是直接使用PIL或matplotlib来显示:
二是使用Qt designer中的Label和GraphicsView两个控件,具体显示操作如下:i
mgname,imgtype = QFileDialog.getOpenFileName(self,
"打开图像","",
"*.jpg;;*.png;;*.jpeg;;*.bmp;;All Files(*)")
img = QPixmap(imgname).scaled(self.imglabel.width(),self.imglabel.height())
#scaled(self.imglabel.width(),self.imglabel.height())为图像尺寸缩放
"""QLabel控件显示"""
self.imglabel.setPixmap(img)
"""QGraphicsView控件显示"""
scene = QGraphicsScene(self)
scene.addItem(QGraphicsPixmapItem(img))
self.graphicsView.setScene(scene)
"""使用PIL原带的函数显示"""
from PIL import Image
im = Image.open(imgname)
im.show()
"""使用matplotlib的函数显示"""
import matplotlib.pyplot as plt
plt.figure(1)
plt.imshow(im)
plt.show()12345678910111213141516171819202122
上面代码放在主窗口显示操作类中,如下
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
from MyImgProprecessGUI import Ui_MainWindow
from PIL import Image
import matplotlib.pyplot as plt
class MyMainWindow(QMainWindow,Ui_MainWindow):
def __init__(self):
super(MyMainWindow,self).__init__()
self.setupUi(self)
#单开图像菜单OpenImg
self.OpenImg.triggered.connect(self.OpenImage)
"""============图像处理部分==============="""
def OpenImage(self):
imgname,imgtype = QFileDialog.getOpenFileName(self,
"打开图像","",
"*.jpg;;*.png;;*.jpeg;;*.bmp;;All Files(*)")
#获得图像
img = QPixmap(imgname).scaled(self.imglabel.width(),self.imglabel.height())
#在label中显示图像
self.imglabel.setPixmap(img)
#在GraphicsView中显示图像
scene = QGraphicsScene(self)
scene.addItem(QGraphicsPixmapItem(img))
self.graphicsView.setScene(scene)
#打开图像在pycharm中另为打开显示窗口
im = Image.open(imgname)
#im.show()
plt.figure(1)
plt.imshow(im)
plt.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
main = MyMainWindow()
main.show()
sys.exit(app.exec_())