Pull to refresh

PyQt4 — Диалоговые окна

Reading time 6 min
Views 26K
Original author: ZetCode
В PyQt4 есть два вида диалогов: предопределенные и пользовательские.

Предопределенные диалоги


QInputDialog

QInputDialog представляет простой диалог для получения единственного значения от пользователя. Значение может быть строкой, числом или пунктом из списка.

#!/usr/bin/python
# inputdialog.py

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore

class InputDialog(QtGui.QWidget):
   def __init__(self, parent=None):
       QtGui.QWidget.__init__(self, parent)
       self.setGeometry(300, 300, 350, 80)
       self.setWindowTitle('InputDialog')
       self.button = QtGui.QPushButton('Dialog', self)
       self.button.setFocusPolicy(QtCore.Qt.NoFocus)
       self.button.move(20, 20)
       self.connect(self.button, QtCore.SIGNAL('clicked()'), self.showDialog)
       self.setFocus()
       self.label = QtGui.QLineEdit(self)
       self.label.move(130, 22)

   def showDialog(self):
       text, ok = QtGui.QInputDialog.getText(self, 'Input Dialog', 'Enter your name:')
       if ok:
           self.label.setText(unicode(text))
           
app = QtGui.QApplication(sys.argv)
icon = InputDialog()
icon.show()
app.exec_()


На форме располагаются кнопка и строка ввода. При нажатии на кнопку открывается диалог ввода для получения текстового значения. Введенный текст будет отображен в строке ввода.

text, ok = QtGui.QInputDialog.getText(self, 'Input Dialog', 'Enter your name:')

Это строка отображает диалог ввода. Первая строка это заголовок диалога, вторая — текст сообщения. Диалог возвращает введенный текст и логическое значение. Если мы нажмем кнопку OK, логическое значение будет true, в противном случае false.
Диалог ввода

QColorDialog

QColorDialog предоставляет диалог для выбора цветов.
#!/usr/bin/python
# colordialog.py

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore

class ColorDialog(QtGui.QWidget):
   def __init__(self, parent=None):
       QtGui.QWidget.__init__(self, parent)
       color = QtGui.QColor(0, 0, 0)
       self.setGeometry(300, 300, 250, 180)
       self.setWindowTitle('ColorDialog')
       self.button = QtGui.QPushButton('Dialog', self)
       self.button.setFocusPolicy(QtCore.Qt.NoFocus)
       self.button.move(20, 20)
       self.connect(self.button, QtCore.SIGNAL('clicked()'), self.showDialog)
       self.setFocus()
       self.widget = QtGui.QWidget(self)
       self.widget.setStyleSheet("QWidget { background-color: %s }" % color.name())
       self.widget.setGeometry(130, 22, 100, 100)

   def showDialog(self):
       color = QtGui.QColorDialog.getColor()
       self.widget.setStyleSheet("QWidget { background-color: %s }" % color.name())

app = QtGui.QApplication(sys.argv)
cd = ColorDialog()
cd.show()
app.exec_()


В этом примере на форме находятся кнопка (QPushButton) и QWidget. Фон виджета закрашен черным цветом. Используя QColorDialog мы можем изменить его фон на указанный нами цвет.

color = QtGui.QColorDialog.getColor()

Эта строка открывает QColorDialog.

self.widget.setStyleSheet("QWidget { background-color: %s }" % color.name())

Мы изменяем цвет фона используя таблицу стилей.
Диалог выбора цвета

QFontDialog

QFontDialog предоставляет диалог для выбора шрифта.
#!/usr/bin/python
# fontdialog.py

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore

class FontDialog(QtGui.QWidget):
   def __init__(self, parent=None):
       QtGui.QWidget.__init__(self, parent)
       hbox = QtGui.QHBoxLayout()
       self.setGeometry(300, 300, 250, 110)
       self.setWindowTitle('FontDialog')
       button = QtGui.QPushButton('Dialog', self)
       button.setFocusPolicy(QtCore.Qt.NoFocus)
       button.move(20, 20)
       hbox.addWidget(button)
       self.connect(button, QtCore.SIGNAL('clicked()'), self.showDialog)
       self.label = QtGui.QLabel('Knowledge only matters', self)
       self.label.move(130, 20)
       hbox.addWidget(self.label, 1)
       self.setLayout(hbox)

   def showDialog(self):
       font, ok = QtGui.QFontDialog.getFont()
       if ok:
           self.label.setFont(font)

app = QtGui.QApplication(sys.argv)
cd = FontDialog()
cd.show()
app.exec_()


В нашем примере, мы расположили на форме QPushButton и QLabel. С помощь QFontDialog мы изменили шрифт QLabel.

hbox.addWidget(self.label, 1)

Мы сделали QLabel с изменяемым размером. Это необходимо, потому как используя различные шрифты текст может становиться больше и надпись может стать не полностью видима.

font, ok = QtGui.QFontDialog.getFont()

Здесь мы открываем диалог выбора шрифтов.

if ok:
   self.label.setFont(font)


Если мы щелкнем по кнопке OK, то шрифт QLabel изменится.
Диалог выбора шрифта

QFileDialog

QFileDialog это диалог, который позволяет пользователям выбирать файлы или папки. Файлы могут быть указаны как для сохранинения так и для открытия.
#!/usr/bin/python
# openfiledialog.py

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore

class OpenFile(QtGui.QMainWindow):
   def __init__(self, parent=None):
       QtGui.QMainWindow.__init__(self, parent)
       self.setGeometry(300, 300, 350, 300)
       self.setWindowTitle('OpenFile')
       self.textEdit = QtGui.QTextEdit()
       self.setCentralWidget(self.textEdit)
       self.statusBar()
       self.setFocus()
       exit = QtGui.QAction(QtGui.QIcon('open.png'), 'Open', self)
       exit.setShortcut('Ctrl+O')
       exit.setStatusTip('Open new File')
       self.connect(exit, QtCore.SIGNAL('triggered()'), self.showDialog)

       menubar = self.menuBar()
       file = menubar.addMenu('&File')
       file.addAction(exit)

   def showDialog(self):
       filename = QtGui.QFileDialog.getOpenFileName(self, 'Open file', '/home')
       file=open(filename)
       data = file.read()
       self.textEdit.setText(data)
       
app = QtGui.QApplication(sys.argv)
cd = OpenFile()
cd.show()
app.exec_()


В этом примере на форме расположена панель меню, QTextEdit и строка статуса. Пункт меню позволяет открыть диалог выбора файлов. Содержимое выбранного файла загружается в QTextEdit. Строка статуса показана исключительно в целях красоты:)

class OpenFile(QtGui.QMainWindow):
   ...
   self.textEdit = QtGui.QTextEdit()
   self.setCentralWidget(self.textEdit)


Этот пример основан на QMainWindow, потому как мы заполнили QTextEdit центр формы. Это легко проделать с помощью QMainWindow без обращения к раскладкам (layouts).

filename = QtGui.QFileDialog.getOpenFileName(self, 'Open file', '/home')

Мы открываем диалог QFileDialog. Второй параметр в методе getOpenFileName это заголовок окна. Третий указывает начальный каталог. Фильтр файлов по умолчанию установлен во All files (*).

file=open(filename)
data = file.read()
self.textEdit.setText(data)


Содержимое выбранного файла прочитывается и заполняет QTextEdit.
Диалог выбора файлов
.
Tags:
Hubs:
+26
Comments 4
Comments Comments 4

Articles