Python界面编程之七----界面搭建

界面搭建(转载于–学点编程吧)

QMainWindow类提供了一个主应用程序窗口。 这使得能够创建具有状态栏,工具栏和菜单栏的经典应用程序框架。

状态栏

这个比较简单,先从这里开始。

from PyQt5.QtWidgets import QApplication, QMainWindow
import sys


class Example(QMainWindow):
    def __init__(self):
        super().__init__()

        self.statusBar().showMessage('准备就绪')
        self.setGeometry(300, 300, 400, 300)
        self.setWindowTitle('状态栏')
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

执行结果:
Python界面编程之七----界面搭建

self.statusBar().showMessage('准备就绪')

要获取状态栏,我们调用QtGui.QMainWindow类的statusBar()方法。 该方法的第一个调用创建一个状态栏。 后续调用返回状态栏对象。 showMessage()在状态栏上显示一条消息。

菜单

简单的菜单

from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp
from PyQt5.QtGui import QIcon
import sys

class Example(QMainWindow):

    def __init__(self):
        super().__init__()
        self.gui_init()

    def gui_init(self):
        self.statusBar().showMessage('准备就绪')

        self.setGeometry(300, 300, 400, 300)
        self.setWindowTitle('简单的菜单')

        exit_act = QAction(QIcon('退出.png'), '退出(&E)', self)
        exit_act.setShortcut('Ctrl+Q')
        exit_act.setStatusTip('退出程序')
        exit_act.triggered.connect(qApp.quit)

        meu_bar = self.menuBar()
        file_menu = meu_bar.addMenu('文件(&F)')
        file_menu.addAction(exit_act)

        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

在上面的例子中,我们用一个菜单创建一个菜单。 此菜单将包含一个选择时终止应用程序的操作。 还创建状态栏。 该操作可通过Ctrl + Q快捷方式访问。
执行结果
执行结果:
Python界面编程之七----界面搭建

exit_act = QAction(QIcon('退出.png'), '退出(&E)', self)
exit_act.setShortcut('Ctrl+Q')
exit_act.setStatusTip('退出程序')

QAction是使用菜单栏,工具栏或自定义键盘快捷方式执行操作的抽象。在上述三行中,我们创建一个具有特定图标和“退出”标签的动作。此外,为此操作定义了快捷方式。当我们将鼠标指针悬停在菜单项上时,第三行创建状态栏显示在状态栏中。

 exit_act.triggered.connect(qApp.quit)

当我们选择这个特定的动作时,发出触发信号。 信号连接到QApplication小部件的quit()方法,终止了应用程序。

meu_bar = self.menuBar()
file_menu = meu_bar.addMenu('文件(&F)')
file_menu.addAction(exit_act)

menuBar()方法创建一个菜单栏。 我们使用addMenu()创建文件菜单,并使用addAction()添加操作。
上面的代码中我们在退出、文件后面都增加了“&”这个符号,增加这个符号后,当我们按住“Alt+F”的时候就能快速打开文件这个菜单,同理按住“Alt+E”的时候就能退出了。

子菜单

子菜单是另一个菜单中的菜单。类似下图中的样子。
Python界面编程之七----界面搭建

from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp, QMenu
from PyQt5.QtGui import QIcon
import sys


class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui_init()

    def ui_init(self):
        self.statusBar().showMessage('准备就绪')

        self.setGeometry(300, 300, 400, 300)
        self.setWindowTitle('子菜单')

        exit_act = QAction(QIcon('退出.png'), '退出(&E)', self)
        exit_act.setShortcut('Ctrl+Q')
        exit_act.setStatusTip('退出程序')
        exit_act.triggered.connect(qApp.quit)

        save_menu = QMenu('保存方式(&S)', self)
        save_act = QAction(QIcon('保存.png'), '保存...', self)
        save_act.setShortcut('Ctrl+S')
        save_act.setStatusTip('保存文件')
        save_as_act = QAction(QIcon('另存为.png'), '另存为...(&O)', self)
        save_as_act.setStatusTip('文件另存为')
        save_menu.addAction(save_act)
        save_menu.addAction(save_as_act)

        new_act = QAction(QIcon('新建.png'), '新建(&N)',self)
        new_act.setShortcut('Ctrl+N')

        men_bar = self.menuBar()
        file_menu = men_bar.addMenu('文件(&F)')
        file_menu.addAction(new_act)
        file_menu.addMenu(save_menu)
        file_menu.addSeparator()
        file_menu.addAction(exit_act)

        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

执行结果
执行结果:
Python界面编程之七----界面搭建

在这个例子中,我们有三个菜单项: 其中两个位于文件菜单中(新建、退出),另一个位于文件的保存子菜单中。

save_menu = QMenu('保存方式(&S)', self)

使用QMenu创建新菜单

save_act = QAction(QIcon('保存.png'), '保存...', self)
save_act.setShortcut('Ctrl+S')
save_act.setStatusTip('保存文件')
save_as_act = QAction(QIcon('另存为.png'), '另存为...(&O)', self)
save_as_act.setStatusTip('文件另存为')
save_menu.addAction(save_act)
save_menu.addAction(save_as_act)

两个动作使用addAction()被添加到子菜单中。

上下文菜单

Windows操作系统中任何地方右击鼠标会出现俗称的“右键菜单”,其实就是指上下文菜单。

from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp, QMenu
from PyQt5.QtGui import QIcon
import sys


class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui_init()

    def ui_init(self):
        self.statusBar().showMessage('准备就绪')

        self.setGeometry(300, 300, 400, 300)
        self.setWindowTitle('子菜单')

        exit_act = QAction(QIcon('退出.png'), '退出(&E)', self)
        exit_act.setShortcut('Ctrl+Q')
        exit_act.setStatusTip('退出程序')
        exit_act.triggered.connect(qApp.quit)

        save_menu = QMenu('保存方式(&S)', self)
        save_act = QAction(QIcon('保存.png'), '保存...', self)
        save_act.setShortcut('Ctrl+S')
        save_act.setStatusTip('保存文件')
        save_as_act = QAction(QIcon('另存为.png'), '另存为...(&O)', self)
        save_as_act.setStatusTip('文件另存为')
        save_menu.addAction(save_act)
        save_menu.addAction(save_as_act)

        new_act = QAction(QIcon('新建.png'), '新建(&N)',self)
        new_act.setShortcut('Ctrl+N')

        men_bar = self.menuBar()
        file_menu = men_bar.addMenu('文件(&F)')
        file_menu.addAction(new_act)
        file_menu.addMenu(save_menu)
        file_menu.addSeparator()
        file_menu.addAction(exit_act)

        self.show()

    def contextMenuEvent(self, QContextMenuEvent):

        c_menu = QMenu(self)

        new_act = c_menu.addAction('新建')
        save_act = c_menu.addAction('保存')
        quit_act = c_menu.addAction('退出')
        action = c_menu.exec_(self.mapToGlobal(QContextMenuEvent.pos()))
        if action == quit_act:
            qApp.quit()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

执行结果
执行结果:
Python界面编程之七----界面搭建
要使用上下文菜单,我们必须重新实现 contextMenuEvent() 方法。

action = c_menu.exec_(self.mapToGlobal(QContextMenuEvent.pos()))

使用exec_()方法显示上下文菜单。 从事件对象获取鼠标指针的坐标。 mapToGlobal()方法将窗口小部件坐标转换为全局屏幕坐标。

if action == quit_act:
    qApp.quit()

如果从上下文菜单返回的操作等于退出操作,我们终止应用程序。

工具栏

各项命令都是在菜单栏当中,但是我们可以把一些常用的命令放在工具栏上,例如新建、打开、保存等等。

from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp, QMenu
from PyQt5.QtGui import QIcon
import sys


class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui_init()

    def ui_init(self):
        self.statusBar().showMessage('准备就绪')

        self.setGeometry(300, 300, 400, 300)
        self.setWindowTitle('工具栏')

        exit_act = QAction(QIcon('退出.png'), '退出(&E)', self)
        exit_act.setShortcut('Ctrl+Q')
        exit_act.setStatusTip('退出程序')
        exit_act.triggered.connect(qApp.quit)

        save_menu = QMenu('保存方式(&S)', self)
        save_act = QAction(QIcon('保存.png'), '保存...', self)
        save_act.setShortcut('Ctrl+S')
        save_act.setStatusTip('保存文件')
        save_as_act = QAction(QIcon('另存为.png'), '另存为...(&O)', self)
        save_as_act.setStatusTip('文件另存为')
        save_menu.addAction(save_act)
        save_menu.addAction(save_as_act)

        new_act = QAction(QIcon('新建.png'), '新建(&N)', self)
        new_act.setShortcut('Ctrl+N')
        new_act.setStatusTip('新建文件')

        men_bar = self.menuBar()
        file_menu = men_bar.addMenu('文件(&F)')
        file_menu.addAction(new_act)
        file_menu.addMenu(save_menu)
        file_menu.addSeparator()
        file_menu.addAction(exit_act)

        tool_bar = self.addToolBar('工具栏')
        tool_bar.addAction(new_act)
        tool_bar.addAction(exit_act)

        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

执行结果
执行结果:
Python界面编程之七----界面搭建

toolbar = self.addToolBar('工具栏')
toolbar.addAction(newAct)
toolbar.addAction(exitAct)

工具栏使用addToolBar()方法创建。 我们使用addAction()向工具栏添加两个动作对象。