QMainWindow和QWidget

摘要:
窗口类型简介:QMainWindow、QWidget和QDialog可用于直接或继承后创建窗口。QMainWindow窗口包含菜单栏、工具栏、状态栏、标题栏等。它是最常见的窗口形式,或GUI程序的主窗口。

 

 一、QMainWindow

  QmainWindow主窗口为用户提供一个应用程序框架,它有自己的布局,可以在布局中添加控件。在主窗口中可以添加控件,比如将工具栏、菜单栏、状态栏等添加到布局管理器中。

  窗口类型介绍:QMainWindow、QWidget、QDialog三个类都可以用来创建窗口,可以直接使用,也可以继承后使用。

  QMainWindow窗口包含菜单栏、工具栏、状态栏、标题栏等,是最常见的窗口形式,也可以说是GUI程序的主窗口。

  QDialog是对话框窗口的基类。对话框主要用来执行短期任务,或者与用户进行互动,它可以是模态的,也可以是非模态的。他没有菜单栏、工具栏、状态栏等。

  如果是主窗口,就使用QMainWindow类;

  如果是对话框,就使用QDialog类;

  如果不确定,有可能作为顶层窗口,也有可能嵌入到其他窗口,就使用QWidget类。

  QMainWindow类中比较重要的方法:

  

方法                                                           描述                                                         
addToolBar()

添加工具栏

centralWidget()返回窗口中心的一个控件,未设置时返回None
menuBar()返回主窗口的菜单栏
setCentralWidget()设置窗口中心的控件
setstatusBar()设置状态栏
statusBar()获得状态栏对象后,调用状态栏对象的showMessage(message,int timeout = 0)方法,显示状态栏信息。第一个参数是要显示的信息,第二个参数是信息停留的时间,单位是ms,默认值为0,表示一直显示状态栏信息。

QmainWindow有自己的布局,它不能再设置布局了

1、创建主窗口

 1 import sys
 2 from PyQt5.QtWidgets import QMainWindow, QApplication
 3 from PyQt5.QtGui import QIcon
 4 
 5 class MainWindow(QMainWindow):
 6     def __init__(self, parent = None):
 7         super(MainWindow, self).__init__(parent)
 8         self.resize(400, 200)
 9         self.status = self.statusBar()
10         self.status.showMessage('这是状态栏显示', 5000)
11         self.setWindowTitle('PyQt MainWindow例子')
12 
13 
14 if __name__ == '__main__':
15     app = QApplication(sys.argv)
16     app.setWindowIcon(QIcon(r'F:火狐浏览器下载的文件	est.jpg'))
17     form = MainWindow()
18     form.show()
19     sys.exit(app.exec_())

结果:

QMainWindow和QWidget第1张

注意这里状态栏信息会显示5秒(代码里面设置了5秒)

2、主窗口居中显示

 1 from PyQt5.QtWidgets import QDesktopWidget, QApplication, QMainWindow
 2 import sys
 3 
 4 class winform(QMainWindow):
 5     def __init__(self, parent = None):
 6         super(winform, self).__init__(parent)
 7         self.setWindowTitle('主窗口放在屏幕中间的例子')
 8         self.resize(400, 200)
 9         self.center()
10 
11     def center(self):
12         screen = QDesktopWidget().screenGeometry() #计算显示屏的尺寸
13         size = self.geometry()          #计算qwidget的窗口大小
14         self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2)  #把窗口移动到屏幕正中央
15 
16 if __name__ == '__main__':
17     app = QApplication(sys.argv)
18     win = winform()
19     win.show()
20     sys.exit(app.exit(app.exec_()))

结果:

QMainWindow和QWidget第2张

在这里使用了QDeskWidget类用来显示计算机显示屏的一些参数信息。然后调用move函数将窗体移动到屏幕正中央。

3、关闭主窗口

 1 from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QPushButton, QHBoxLayout
 2 import sys
 3 
 4 class winform(QMainWindow):
 5     def __init__(self, parent = None):
 6         super(winform, self).__init__(parent)
 7         self.setWindowTitle('关闭主窗口例子')
 8         self.button1 = QPushButton('关闭主窗口1')
 9         # self.button2 = QPushButton('关闭主窗口2')
10         self.button1.clicked.connect(self.onButtonClick)  #绑定动作函数
11         # self.button2.clicked.connect(self.onButtonClick)  #绑定动作函数
12 
13         layout = QHBoxLayout()
14         layout.addWidget(self.button1)
15         # layout.addWidget(self.button2)
16 
17         main_frame = QWidget()
18         main_frame.setLayout(layout)
19         self.setCentralWidget(main_frame)
20 
21     def onButtonClick(self):
22         #sender是发送信号的对象,此处发送信号的对象是button1按钮
23         sender = self.sender()
24         print(sender.text() + '被按下了')
25         qApp = QApplication.instance()
26         qApp.quit()
27 
28 if __name__ == '__main__':
29     app = QApplication(sys.argv)
30     form = winform()
31     form.show()
32     sys.exit(app.exec_())

 结果:

QMainWindow和QWidget第3张

这里在主窗口上面添加了一个Button按钮控件,并将其绑定到onButtonClick函数上面。当按下按钮的时候,会调用onButtonClick函数,该函数里面又调用了quit函数。主窗口退出。

二、QWidget

  基础窗口控件QWidget类是所有用户界面对象的基类,所有窗口或者控件都直接或间接继承自QWidget类。

1、QWidget不包含边框的常用函数

  • 改变用户区的面积:
    QWidget.resize(width, height)
    QWidget.resize(Qsize)
  • 获得用户区的大小:
    QWidget.size()
  • 获得用户区的宽度和高度:
    QWidget.width()
    QWidget.height()
  • 设置客户区的高度、宽度、和面积(形成的窗体不可以使用鼠标来改变大小)
    QWidget.setFixedHeight()
    QWidget.setFixedWidth()
    QWidget.setFixedSize()
  • 设置客户区的大小和位置:

    Qwidget.setGeometry(int x, int y, int width, int height)#位置和大小

 2、QWidget包含边框的常用函数

  • 获得窗体的大小和位置
    QWidget.frameGeometry()
  • 设置窗口的位置
    QWiget.move(int x, int y)
  • 获得窗口左上角的的坐标
    QWidget.pos()

3、屏幕坐标系统显示

 1 from PyQt5.QtWidgets import QWidget, QApplication, QPushButton
 2 import sys
 3 
 4 app = QApplication(sys.argv)
 5 widget = QWidget()
 6 btn = QPushButton(widget)
 7 btn.setText("Button")
 8 
 9 #以QWidget左上角为(0, 0)点
10 btn.move(20, 20)
11 
12 widget.resize(300, 200)     #设置窗口的大小
13 widget.move(250, 200)       #设置窗口的位置   以显示屏作为标准
14 
15 widget.setWindowTitle('PyQt坐标系统例子')
16 widget.show()
17 print('QWidget:')
18 print('w.x() = %d'%widget.x())      #窗体的位置
19 print('w.y() = %d'%widget.y())
20 print('w.width() = %d'%widget.width())      #窗体的尺寸
21 print('w.height() = %d'%widget.height())
22 print('QWidget.geometry')
23 print('widget.geometry().x() = %d'%widget.geometry().x())       #窗体用户区(即不包含边框)的位置
24 print('widget.geometry().y() = %d'%widget.geometry().y())
25 print('widget.geometry().width() = %d'%widget.geometry().width())       #窗体用户区(即不包含边框)的位置
26 print('widget.geometry().height() = %d'%widget.geometry().height())
27 
28 sys.exit(app.exec_())

结果:

QMainWindow和QWidget第4张

4、建立一个主窗口

 

import sys
from PyQt5.QtWidgets import QApplication, QWidget

app = QApplication(sys.argv)

window = QWidget()
window.resize(300, 200)
window.move(250, 150)
window.setWindowTitle('hello PyQT5')
window.show()

sys.exit(app.exec_())

 结果:
QMainWindow和QWidget第5张

 5、设置程序图标

 1 import sys
 2 from PyQt5.QtWidgets import QApplication, QWidget
 3 from PyQt5.QtGui import QIcon
 4 
 5 class Icon(QWidget):
 6     def __init__(self, parent = None):
 7         super(Icon, self).__init__(parent)
 8         self.initUI()
 9 
10     def initUI(self):
11         self.setGeometry(300, 300, 1250, 150)
12         self.setWindowTitle('程序图标')
13         self.setWindowIcon(QIcon(r'F:火狐浏览器下载的文件	est.jpg'))
14 
15 if __name__ == '__main__':
16     app = QApplication(sys.argv)
17     icon = Icon()
18     icon.show()
19     sys.exit(app.exec_())

 结果:

QMainWindow和QWidget第6张

6、显示气泡提示信息

 1 import sys
 2 from PyQt5.QtWidgets import QApplication, QWidget, QToolTip
 3 from PyQt5.QtGui import QFont
 4 
 5 class winform(QWidget):
 6     def __init__(self):
 7         super().__init__()
 8         self.initUI()
 9 
10     def initUI(self):
11         QToolTip.setFont(QFont('SansSerif', 10))
12         self.setToolTip('这是一个<b>气泡提示</b>')
13         self.setGeometry(200, 300, 400, 400)
14         self.setWindowTitle('气泡提示demo')
15 
16 if __name__ == '__main__':
17     app = QApplication(sys.argv)
18     win = winform()
19     win.show()
20     sys.exit(app.exec_())

 结果:

QMainWindow和QWidget第7张

当鼠标放置在窗体上时候,会出现该气泡提示。

免责声明:文章转载自《QMainWindow和QWidget》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JAVA中最常用的快捷键总结Oracle安装下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

android 获取控件位置坐标,屏幕尺寸,标题栏,状态栏高度

1.屏幕尺寸,源代码如下: DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); int screenWidth=metrics.widthPixels; //屏幕宽度 int...

React native随笔——解决navigation导航栏 android和ios样式不统一

navigation导航栏存在android和ios样式不统一的问题。Android手机上标题不居中,导航栏与状态栏重合。 解决方法为在navigationOptions中进行如下配置。 一、Android中标题不居中 headerTitleStyle: { alignSelf: 'center', textAlign: 'center', f...

cocos2dx 实现应用内屏幕旋转,ios端弹出虚拟键盘导致界面显示异常的问题

项目上遇到这样的需求,总体界面要横屏,但是部分界面需要切换到竖屏,同时横竖屏的界面都会有编辑框。 网上目前有很多资料涉及到这个的,安卓端实现很简单,横竖屏切换两三行代码就可以实现;ios端网上目前也有方案,比安卓稍微复杂点,但是也可以实现。但是涉及到界面上有编辑框,会弹出输入键盘的时候,ios端的界面就会出现异常。目前引擎对于编辑框的处理,在弹出键盘的时候...

iOS 隐藏状态栏

1.整个项目隐藏状态栏 在Targets->General->勾选中Hide status bar . 整个项目隐藏状态栏 2.单个界面隐藏状态栏,例如登录注册页面 1.首先在info.plist里面View controller-based status bar appearance 设置为 NO. 2.在需要调控状态栏的ViewCo...

Notification使用以及PendingIntent.getActivity() (转)

public void sendNotification(Context ctx,String message) { //get the notification manager String ns = Context.NOTIF...

Android沉浸式状态栏实现

在安卓开发当中,顶部的状态栏很多时候是和我们自己所设定的安卓背景颜色不相同的,看起来就十分别扭,就如同下图所示,状态栏是深绿色,我们的背景却是一个十分好看的渐变颜色: 在使用沉浸式状态栏之后的界面如下: 如何将顶部的状态栏设置成透明的呢,我们可以在主活动的 onCreate() 方法当中输入以下代码: if(Build.VERSION.SDK_INT&g...