Кнопка Qt только отвечает на возврат, когда имеет фокус - Требуется пользовательский обработчик событий? - PullRequest
1 голос
/ 17 февраля 2012

Я создаю приложение Qt, используя PyQt4 в Python.Я выбрал Диалог в качестве виджета приложения верхнего уровня.Я прочитал и понял свойства кнопок Default и AutoDefault для кнопок.Мне нужно следующее поведение: кнопки реагируют на нажатия или когда они имеют фокус (через вкладку), и пользователь нажимает Enter.Я также хочу, чтобы они меняли цвет, когда у них есть фокус.Я не хочу, чтобы они отвечали на Enter, когда у них нет фокуса.Это потому, что у меня есть поле TextEdit, для которого я хочу, чтобы Enter интерпретировался буквально как CR.Если я включаю AutoDefault на кнопках, одна из них выбирается по умолчанию (или я могу назначить ее), и эта кнопка активируется, если я нажимаю enter.Он подсвечивается постоянно, кроме случаев, когда фокус находится на другой кнопке.Если я отключу AutoDefault, ни одна из кнопок не будет выделена, даже если они имеют фокус, и они не реагируют на ввод, а только пробел, когда они имеют фокус.Это оставляет пользователя слепым относительно того, где фокус находится.

Мой вопрос: мне нужно написать собственный обработчик событий, чтобы включить желаемое поведение?Соответствующий вопрос: лучше ли мне не использовать диалог в качестве моего верхнего уровня.

Я использую Qt Designer и pyqtuic.Вот выдержка из кода для одной из двух кнопок (другая выполняет те же операции):

    self.QuitButton = QtGui.QPushButton(Dialog)
    self.QuitButton.setFocusPolicy(QtCore.Qt.StrongFocus)
    self.QuitButton.setAutoDefault(False)

Полный код доступен, если требуется.

Спасибо.


Изменить 2: 18 7:00.Полный код следует.Первый из двух модулей - это модуль, созданный pyuic из файла .ui дизайнера: «email.py»:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'email.ui'
#
# Created: Thu Feb 16 20:12:55 2012
#      by: PyQt4 UI code generator 4.9.1
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(643, 480)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
        Dialog.setSizePolicy(sizePolicy)
        palette = QtGui.QPalette()
        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
        brush = QtGui.QBrush(QtGui.QColor(56, 255, 72))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(184, 255, 189))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Light, brush)
        brush = QtGui.QBrush(QtGui.QColor(120, 255, 130))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Midlight, brush)
        brush = QtGui.QBrush(QtGui.QColor(28, 127, 36))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Dark, brush)
        brush = QtGui.QBrush(QtGui.QColor(37, 170, 48))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Mid, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.BrightText, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ButtonText, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(56, 255, 72))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Shadow, brush)
        brush = QtGui.QBrush(QtGui.QColor(155, 255, 163))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.AlternateBase, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 220))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipBase, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipText, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
        brush = QtGui.QBrush(QtGui.QColor(56, 255, 72))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(184, 255, 189))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Light, brush)
        brush = QtGui.QBrush(QtGui.QColor(120, 255, 130))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Midlight, brush)
        brush = QtGui.QBrush(QtGui.QColor(28, 127, 36))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Dark, brush)
        brush = QtGui.QBrush(QtGui.QColor(37, 170, 48))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Mid, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.BrightText, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ButtonText, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(56, 255, 72))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Shadow, brush)
        brush = QtGui.QBrush(QtGui.QColor(155, 255, 163))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.AlternateBase, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 220))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipBase, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipText, brush)
        brush = QtGui.QBrush(QtGui.QColor(28, 127, 36))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
        brush = QtGui.QBrush(QtGui.QColor(56, 255, 72))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(184, 255, 189))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Light, brush)
        brush = QtGui.QBrush(QtGui.QColor(120, 255, 130))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Midlight, brush)
        brush = QtGui.QBrush(QtGui.QColor(28, 127, 36))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Dark, brush)
        brush = QtGui.QBrush(QtGui.QColor(37, 170, 48))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Mid, brush)
        brush = QtGui.QBrush(QtGui.QColor(28, 127, 36))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.BrightText, brush)
        brush = QtGui.QBrush(QtGui.QColor(28, 127, 36))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, brush)
        brush = QtGui.QBrush(QtGui.QColor(56, 255, 72))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(56, 255, 72))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Shadow, brush)
        brush = QtGui.QBrush(QtGui.QColor(56, 255, 72))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.AlternateBase, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 220))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipBase, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipText, brush)
        Dialog.setPalette(palette)
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("Times New Roman"))
        font.setPointSize(16)
        Dialog.setFont(font)
        self.body = QtGui.QTextEdit(Dialog)
        self.body.setGeometry(QtCore.QRect(20, 90, 601, 341))
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.body.sizePolicy().hasHeightForWidth())
        self.body.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("Times New Roman"))
        font.setPointSize(18)
        self.body.setFont(font)
        self.body.setFocusPolicy(QtCore.Qt.StrongFocus)
        self.body.setObjectName(_fromUtf8("body"))
        self.bodylabel = QtGui.QLabel(Dialog)
        self.bodylabel.setGeometry(QtCore.QRect(20, 60, 141, 31))
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("Times New Roman"))
        self.bodylabel.setFont(font)
        self.bodylabel.setObjectName(_fromUtf8("bodylabel"))
        self.subjectlabel = QtGui.QLabel(Dialog)
        self.subjectlabel.setGeometry(QtCore.QRect(20, 16, 71, 31))
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("Times New Roman"))
        self.subjectlabel.setFont(font)
        self.subjectlabel.setObjectName(_fromUtf8("subjectlabel"))
        self.SendButton = QtGui.QPushButton(Dialog)
        self.SendButton.setGeometry(QtCore.QRect(336, 440, 121, 31))
        palette = QtGui.QPalette()
        brush = QtGui.QBrush(QtGui.QColor(0, 255, 127))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Light, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 255, 127))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Light, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 255, 127))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Light, brush)
        self.SendButton.setPalette(palette)
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("Times New Roman"))
        font.setPointSize(14)
        self.SendButton.setFont(font)
        self.SendButton.setFocusPolicy(QtCore.Qt.StrongFocus)
        self.SendButton.setAutoDefault(False)
        self.SendButton.setObjectName(_fromUtf8("SendButton"))
        self.QuitButton = QtGui.QPushButton(Dialog)
        self.QuitButton.setGeometry(QtCore.QRect(470, 440, 121, 31))
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("Times New Roman"))
        font.setPointSize(14)
        self.QuitButton.setFont(font)
        self.QuitButton.setFocusPolicy(QtCore.Qt.StrongFocus)
        self.QuitButton.setAutoDefault(False)
        self.QuitButton.setObjectName(_fromUtf8("QuitButton"))
        self.subject = QtGui.QLineEdit(Dialog)
        self.subject.setGeometry(QtCore.QRect(90, 16, 531, 31))
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.subject.sizePolicy().hasHeightForWidth())
        self.subject.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("Times New Roman"))
        font.setPointSize(16)
        self.subject.setFont(font)
        self.subject.setFocusPolicy(QtCore.Qt.StrongFocus)
        self.subject.setObjectName(_fromUtf8("subject"))

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
        Dialog.setTabOrder(self.body, self.SendButton)
        Dialog.setTabOrder(self.SendButton, self.QuitButton)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Send Message to \"afamily\"", None, QtGui.QApplication.UnicodeUTF8))
        self.bodylabel.setText(QtGui.QApplication.translate("Dialog", "Message Body", None, QtGui.QApplication.UnicodeUTF8))
        self.subjectlabel.setText(QtGui.QApplication.translate("Dialog", "Subject", None, QtGui.QApplication.UnicodeUTF8))
        self.SendButton.setText(QtGui.QApplication.translate("Dialog", "Send Email", None, QtGui.QApplication.UnicodeUTF8))
        self.QuitButton.setText(QtGui.QApplication.translate("Dialog", "Cancel-Quit", None, QtGui.QApplication.UnicodeUTF8))

Ниже приведен код приложения, второй издва модуля):

import sys
from PyQt4 import QtCore
from PyQt4 import QtGui
from email import Ui_Dialog

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class DialogWindow(QtGui.QDialog):

    def __init__(self):
        QtGui.QDialog.__init__(self)

        self.ui=Ui_Dialog()  # instantiates the GUI class.
        self.ui.setupUi(self)

        # # callbacks for things (connects)
        QtCore.QObject.connect(self.ui.SendButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.send)
        QtCore.QObject.connect(self.ui.QuitButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.closenow)

        #QtCore.QMetaObject.connectSlotsByName(Dialog)

        # start with focus on Subject box
        QtGui.QWidget.setFocus(self.ui.subject)
        self.ui.body.setTabChangesFocus(True)

    def send(self):
        print("sending")
        self.close()

    def closenow(self):
        print("closing")
        self.close()


def main():
    app = QtGui.QApplication(sys.argv)
    window = DialogWindow()
    window.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

Ответы [ 4 ]

2 голосов
/ 17 февраля 2012

Установить ярлык, связывающий кнопку с клавишей Return.

Вы сказали, что используете Qt Designer.Зайдите в свойства кнопки и в QAbstractButton-> ярлык нажмите клавишу «Return» в поле.

В коде, что-то вроде этого может работать:

self.QuitButton.setShortcut( tr("Return") );
1 голос
/ 18 февраля 2012

Возможно, я неправильно понял ваш вопрос.Вы хотите, чтобы QPushButton отвечал на Enter/Return так, как если бы на него щелкнули?

Прежде всего, способ, которым Qt реализует вещи, является своего рода стандартизированным взаимодействием пользовательского интерфейса ( Руководство MS , Руководство гнома / 10.2.4.2 ).Вкратце:

  • Space: переключение активной кнопки
  • Return: переключение кнопки по умолчанию (если доступно)

СловоОсторожно: изменение этих значений может привести к сбою некоторых (большинства?) ваших пользователей.

Если вы хотите настраивать поведение (например, описанное вами), вам нужно предоставить собственный виджет путем подкласса QPushButton.Вам просто нужно переопределить keyPressEvent и keyReleaseEvent, чтобы эмулировать Space нажатие, когда пользователь нажимает Return.

Часть с подсветкой, я не понимаю.Для меня QPushButton определенно выделяется, когда он имеет фокус.Опять же, если вам нужно пользовательское поведение, просто установите таблицу стилей с помощью псевдо-свойства :focus.

Вот один из способов реализации этой пользовательской кнопки:

class EnterPushButton(QtGui.QPushButton):
    def __init__(self, parent=None):
        super(EnterPushButton, self).__init__(parent)

        # Sets the active button text color to red. Change accordingly.
        self.setStyleSheet(":focus {color: red; }")

    def keyPressEvent(self, e):
        if e.key() == QtCore.Qt.Key_Return:
            # If Return is pressed, replace it with Space
            e = QtGui.QKeyEvent(QtCore.QEvent.KeyPress, 
                                QtCore.Qt.Key_Space, 
                                e.modifiers(), 
                                e.text(), 
                                e.isAutoRepeat(), 
                                e.count())

        # Call the base class event handler
        super(EnterPushButton, self).keyPressEvent(e)

    def keyReleaseEvent(self, e):
        if e.key() == QtCore.Qt.Key_Return:
            e = QtGui.QKeyEvent(QtCore.QEvent.KeyRelease,
                                QtCore.Qt.Key_Space, 
                                e.modifiers(), 
                                e.text(), 
                                e.isAutoRepeat(), 
                                e.count())

        super(EnterPushButton, self).keyReleaseEvent(e)

Относительно использования QDialog для главного окна, давайте просто скажем, что это нетрадиционно.Обычно QMainWindow является основным окном, а другие порожденные подокна в главном окне QDialog.Хотя использование главного окна QDialog не помешает, вы можете найти QMainWindow более удобным для всех этих функций: строка меню, строка состояния, toobar и т. Д.

1 голос
/ 17 февраля 2012

Вы пытались использовать и / или переопределить функции focusInEvent и focusOutEvent?

Когда кнопка получает событие (focusInEvent), вы устанавливаете для autoDefault значение True, когда оно теряет фокус, вы устанавливаете для autoDefault значение False. (если я понимаю, что вы хотите сделать)

0 голосов
/ 11 марта 2012

Вот к чему я наконец пришел в решении этой проблемы.Я потратил довольно много времени, пытаясь контролировать внешность в соответствии с моими пожеланиями.Вероятно, это халтура PyQt с использованием таблиц стилей.По крайней мере, я это понимаю!Таблицы стилей - это единственный способ контролировать некоторые элементы внешнего вида.Сначала найдите файл UI-> PY из пользовательского интерфейса, созданного мной в Qt Designer.

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_SendAfamilyEmail(object):
    def setupUi(self, SendAfamilyEmail):
        SendAfamilyEmail.setObjectName(_fromUtf8("SendAfamilyEmail"))
        SendAfamilyEmail.resize(840, 600)
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("Arial"))
        font.setPointSize(16)
        font.setBold(True)
        font.setWeight(75)
        SendAfamilyEmail.setFont(font)
        self.centralwidget = QtGui.QWidget(SendAfamilyEmail)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.verticalLayoutWidget = QtGui.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 0, 821, 581))
        self.verticalLayoutWidget.setObjectName(_fromUtf8("verticalLayoutWidget"))
        self.verticalLayout = QtGui.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setMargin(0)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        spacerItem = QtGui.QSpacerItem(40, 7, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        self.verticalLayout.addItem(spacerItem)
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.subjectLabel = QtGui.QLabel(self.verticalLayoutWidget)
        self.subjectLabel.setMinimumSize(QtCore.QSize(78, 0))
        self.subjectLabel.setObjectName(_fromUtf8("subjectLabel"))
        self.horizontalLayout.addWidget(self.subjectLabel)
        self.subject = QtGui.QLineEdit(self.verticalLayoutWidget)
        self.subject.setObjectName(_fromUtf8("subject"))
        self.horizontalLayout.addWidget(self.subject)
        self.verticalLayout.addLayout(self.horizontalLayout)
        spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        self.verticalLayout.addItem(spacerItem1)
        self.bodyLabel = QtGui.QLabel(self.verticalLayoutWidget)
        self.bodyLabel.setObjectName(_fromUtf8("bodyLabel"))
        self.verticalLayout.addWidget(self.bodyLabel)
        self.body = QtGui.QTextEdit(self.verticalLayoutWidget)
        self.body.setTabChangesFocus(True)
        self.body.setUndoRedoEnabled(False)
        self.body.setTabStopWidth(0)
        self.body.setAcceptRichText(False)
        self.body.setObjectName(_fromUtf8("body"))
        self.verticalLayout.addWidget(self.body)
        spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        self.verticalLayout.addItem(spacerItem2)
        self.horizontalLayout_2 = QtGui.QHBoxLayout()
        self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
        self.send = QtGui.QPushButton(self.verticalLayoutWidget)
        self.send.setObjectName(_fromUtf8("send"))
        self.horizontalLayout_2.addWidget(self.send)
        self.quit = QtGui.QPushButton(self.verticalLayoutWidget)
        self.quit.setObjectName(_fromUtf8("quit"))
        self.horizontalLayout_2.addWidget(self.quit)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        SendAfamilyEmail.setCentralWidget(self.centralwidget)
        self.subjectLabel.setBuddy(self.subject)
        self.bodyLabel.setBuddy(self.body)

        self.retranslateUi(SendAfamilyEmail)
        QtCore.QMetaObject.connectSlotsByName(SendAfamilyEmail)
        SendAfamilyEmail.setTabOrder(self.subject, self.body)
        SendAfamilyEmail.setTabOrder(self.body, self.send)
        SendAfamilyEmail.setTabOrder(self.send, self.quit)

    def retranslateUi(self, SendAfamilyEmail):
        SendAfamilyEmail.setWindowTitle(QtGui.QApplication.translate("SendAfamilyEmail", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.subjectLabel.setText(QtGui.QApplication.translate("SendAfamilyEmail", "Subject", None, QtGui.QApplication.UnicodeUTF8))
        self.bodyLabel.setText(QtGui.QApplication.translate("SendAfamilyEmail", "Body", None, QtGui.QApplication.UnicodeUTF8))
        self.send.setText(QtGui.QApplication.translate("SendAfamilyEmail", "Send Mail", None, QtGui.QApplication.UnicodeUTF8))
        self.quit.setText(QtGui.QApplication.translate("SendAfamilyEmail", "Quit, Do Not Send", None, QtGui.QApplication.UnicodeUTF8))

Затем вы можете найти код верхнего уровня.В нем есть все хаки.Обратите внимание, что это приложение читает контакты из gmail и отправляет сообщение через gmain.

import sys
from PyQt4 import QtCore   # All GUI imports
from PyQt4 import QtGui
from PyQt4.Qt import Qt
from email2 import Ui_SendAfamilyEmail

import smtplib    # Import smtplib for the actual sending function
import mimetypes  # For guessing MIME type
import email      # Import the email modules we'll need
import email.mime.application
import email.utils as ut
# these are all needed to get Google's contact
import atom,gdata.contacts.data,gdata.contacts.client

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class MainWindow(QtGui.QMainWindow):

    def __init__(self):
    self.myaddress='my.email@gmail.com';self.mypassword='my passord'

        QtGui.QMainWindow.__init__(self)

        self.ui=Ui_SendAfamilyEmail()  # instantiates the GUI class.
        self.ui.setupUi(self)

        # callbacks for things (connects)
    QtCore.QObject.connect(self.ui.send, QtCore.SIGNAL(_fromUtf8("clicked()")), self.send)
        QtCore.QObject.connect(self.ui.quit, QtCore.SIGNAL(_fromUtf8("clicked()")), self.closenow)

        # start with focus on Subject box
        QtGui.QWidget.setFocus(self.ui.subject)

        # set up label appearance
    style_string = "QLabel { color: rgb(69,0,208); }"
    self.ui.subjectLabel.setStyleSheet(style_string)
    self.ui.bodyLabel.setStyleSheet(style_string)

    # set up button appearance
    self.ui.send.setAutoFillBackground(True)
    self.ui.quit.setAutoFillBackground(True)
    style_string = "QPushButton { background-color: rgb(200,200,200); color: rgb(69, 0, 208); font-size: 16pt; border-style: outset; border: 2px solid black; } QPushButton:hover { background-color: orange;} QPushButton:focus { background-color: orange; }"
    self.ui.send.setStyleSheet(style_string)
    self.ui.quit.setStyleSheet(style_string)

    # setup text boxes font color and cursor width
    self.ui.subject.setStyleSheet("QLineEdit { color: rgb(69, 0, 208); border: 2px solid orange; }")
    self.ui.body.setStyleSheet("QTextEdit { color: rgb(69, 0, 208); border: 2px solid orange; }")
    self.ui.body.setCursorWidth(5)
    # not available: self.ui.subject.setCursorWidth(5)

    self.GetContacts()

    def GetContacts(self):
    self.recipients = list()
    client = gdata.contacts.client.ContactsClient(source='email assistant')
    client.ClientLogin(self.myaddress,self.mypassword,client.source)

    feed = client.GetGroups()
    for i, entry in enumerate(feed.entry):
        if entry.title.text == 'afamily':
        id = entry.id.text

    feed = client.GetContacts()
    while feed:
        for entry in feed.entry:
        printme = False
        for group in entry.group_membership_info:
            if group.href == id:
            printme = True
        if printme:
            for email in entry.email:
            if email.primary:
                fmted = ut.formataddr(('"'+entry.title.text+'"', \
                           email.address))
                self.recipients.append(fmted)
        nextfeed = feed.GetNextLink()
        feed = None
        if nextfeed:
        feed = client.GetContacts(uri=nextfeed.href)

    feed = None
    client = None


    def send(self):
        #print('now sending')
        # Create a text/plain message
    msg = email.mime.Multipart.MIMEMultipart()
    msg['Subject'] = self.ui.subject.text().toAscii().data()
    msg['From'] = self.myaddress
    msg['To'] = ','.join(self.recipients)

    # The main body is just another attachment
    body1 = self.ui.body.toPlainText().toAscii().data()
    body = email.mime.Text.MIMEText(body1)
    msg.attach(body)
        #print('message is built')
    # send via Gmail server
    s = smtplib.SMTP('smtp.gmail.com',587)
    s.starttls()
    #print('start tls done')
    s.login(self.myaddress, self.mypassword)
    #print('about to send: ' + self.myaddress + '\n' + self.recipients.__str__()+'\n'\
        #      +msg.as_string())
    s.sendmail(self.myaddress,self.recipients,msg.as_string())
    #print('sent email')
    s.quit()
    self.close()


    def closenow(self):
        self.close()


    def keyPressEvent(self,event):
    if event.key() == Qt.Key_Enter or event.key() == Qt.Key_Return:
        if self.ui.send.hasFocus():
        self.send()
        if self.ui.quit.hasFocus():
        self.closenow()


def main():
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    #window.setMinimumSize(640,480)
    window.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

При обработке нажатий клавиш вкладка перемещается между четырьмя виджетами.Когда кнопки имеют фокус, нажатие кнопки возврата приведет к активации кнопки.

...