Меню и панели инструментов в PyQt5 [Урок №3]
Изучение PyQt5 PyQt, QAction, QApplication, QIcon, QMainWindow, QTextEdit, QtGui, QtWidgets, showMessage, statusBar, примеры PyQt
В этой части руководства PyQt5, мы будем создавать меню и панели инструментов. Меню – это группа команд, располагающаяся ниже строки заголовка программы. Панель инструментов содержит кнопки с несколькими распространенными командами в приложении.
Основное окно
Класс QMainWindow предоставляет главное окно приложения. Он позволяет создать классический каркас приложения со строкой состояния, панелями инструментов и меню.
Строка состояния
Строка состояния – это виджет, который используется для отображения сведений о состоянии.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.statusBar().showMessage('Ready')
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Statusbar')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Строку состояния создают с помощью виджета QMainWindow.
self.statusBar().showMessage('Ready')
Чтобы получить строку состояния, мы вызываем метод statusBar() класса QtGui.QMainWindow. Первый вызов метода создаёт строку состояния. Последующие вызовы возвращают объект строки состояния. showMessage() отображает сообщение в строке состояния.
Меню программы
Строка меню – это распространенная часть приложений с графическим интерфейсом (GUI).
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
exitAction = QAction(QIcon('exit.png'), '&Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')
exitAction.triggered.connect(qApp.quit)
self.statusBar()
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAction)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Menubar')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
В примере выше, мы создаём строку меню с одним набором команд. Этот набор команд будет содержать одно действие, завершающее приложение при его выборе. Строка состояния тоже создаётся. Действие доступно с горячей клавишей Ctrl+Q.
exitAction = QAction(QIcon('exit.png'), '&Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')
QAction – это абстракция для действий, выполняемых из меню, панелью инструментов или с использованием горячей клавишей. В приведённых выше трёх строках, мы создаём действие с определённой иконкой и меткой «Exit». Кроме того, для этого действия определена горячая клавиша. Третья строка создаёт подсказку, которая показывается в строке состояния, когда мы наводим курсор мыши на пункт меню.
exitAction.triggered.connect(qApp.quit)
Когда мы выбираем конкретное действие, срабатывает инициирующий сигнал. Сигнал присоединяют к методу quit() виджета QApplication. Это завершает приложение.
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAction)
Метод menuBar() создаёт строку меню. Мы создаём меню «File» и добавляем в него действие выхода из приложения.
Панель инструментов
Все команды из меню, которые мы можем использовать в приложении. Панели инструментов предоставляют быстрый доступ к большинству часто используемых команд.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
exitAction = QAction(QIcon('exit24.png'), 'Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.triggered.connect(qApp.quit)
self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAction)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Toolbar')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
В вышеприведённом примере, мы создаём простую панель инструментов. Она имеет один инструмент, действие выхода, которое завершает приложение, будучи инициированным.
exitAction = QAction(QIcon('exit24.png'), 'Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.triggered.connect(qApp.quit)
В аналогичном примере как с созданием меню выше, мы создаём объект действия. Объект имеет метку, иконку и горячую клавишу. Метод quit() из QtGui.QMainWindow присоединяется к инициирующему сигналу.
self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAction)
Здесь мы создаём панель инструментов и подключаем объект действия к ней.
Рисунок: Панель инструментов
Совместное размещение
В последнем примере этой части, мы создадим меню, панель инструментов и строку состояния. Мы также создадим центральный виджет.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QMainWindow, QTextEdit, QAction, QApplication
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
textEdit = QTextEdit()
self.setCentralWidget(textEdit)
exitAction = QAction(QIcon('exit24.png'), 'Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')
exitAction.triggered.connect(self.close)
self.statusBar()
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAction)
toolbar = self.addToolBar('Exit')
toolbar.addAction(exitAction)
self.setGeometry(300, 300, 350, 250)
self.setWindowTitle('Main window')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Этот пример кода создаёт каркас классического графического приложения состоящей из меню, панелью инструментов и строкой состояния.
textEdit = QTextEdit()
self.setCentralWidget(textEdit)
Здесь мы создаём виджет редактирования текста. Мы устанавливаем его так, чтобы он был центральным виджетом QMainWindow. Центральный виджет займёт всё оставшееся пространство.
Рисунок: Главное окно
В этой части руководства PyQt5, мы работали с меню, панелями управления, строкой состояния и главным окном приложения.
Есть: ubuntu 15.04 , PyQt5.4
В примере: Меню программы
Не отрабатывают следующие строчки:
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')
На нажатие Ctrl+Q - ни какой реакции.
И подсказка не выводится.
Есть: ubuntu 16.04 , PyQt5.4
В примере: Меню программы не работает ничего, кроме выхода по нажатию ctrl+q.
Никакого меню нет, в общем, просто пустое окно. Решение: exitActi 'Exit', self) тоже не работает.
Единственное, что я выяснила, это то, что проблема в самой системе. То есть, нет поддержки иконок на убунту.
Подскажите, что сделать?
ubuntu 17.04, python 3.5.3, PyQt5.9
Строка меню не создаётся
Разобрался. Вот как нужно, чтобы меню отображалось:
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File;') exitActi '&Exit;', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')
exitAction.triggered.connect(qApp.quit)
fileMenu.addAction(exitAction)
Глюк какой-то. Повторяю вторую строку
fileMenu = menubar.addMenu('&File;')
и третью строку exitActi '&Exit;', self)
а то они в предыдущем комменте слились во что-то непотребное :)
Да что за проблема такая с третьей строкой?
Попробую записать её в столбик, может тогда отобразится нормально
exitActi
QIcon('exit.png'),
'&Exit;', self)
Короче, админ, ремонтируй свой сайт :)
Создание меню вообще не работает
Неясно несколько моментов со следующей строкой:
exitAction.triggered.connect(qApp.quit)
в пункте создания панели инструментов:
1. Зачем использовать qApp вместо QApplication?
Какие преимущества это дает?
2. В предыдущем уроке в пункте "Закрытие окна" для закрытия использовался следующий код:
qbtn.clicked.connect(QCoreApplication.instance().quit)
В чем его отличия от exitAction.triggered.connect(qApp.quit)?