Форум сайта python.su
Как реализовать удобное поведение PyQt (PySide) формы, по умолчанию оно ужасно.
Написал примерчик, подскажите как сделать следующее:
1) выделение содержимого при щелчке мыши в doubleSpinBox
2) переход между виджетами по клавише enter
3) сделать чтобы doubleSpinBox понимал разделитель дробной части с клавиши точка на цифровой клавиатуре (numpad) в любой раскладке (в примере понимает только русскую)
4) установить фокус и выделение в первом виджете порядка обхода при запуске программы.
Очень странно что это не сделано по умолчанию или через дизайнер форм.
Cам примерчик:
# -*- coding: utf-8 -*- import sys from PySide import QtCore, QtGui from form import Ui_MainWindow class ControlMainWindow(QtGui.QMainWindow): def __init__(self, parent=None): super(ControlMainWindow, self).__init__(parent) self.ui = Ui_MainWindow() self.ui.setupUi(self) self.ui.pushButton.clicked.connect(self.sum) @QtCore.Slot() def sum(self): number=self.ui.doubleSpinBox.value()+self.ui.doubleSpinBox_2.value() self.ui.label.setText(u"сумма %.2f"%(number)) def main(): app = QtGui.QApplication(sys.argv) win = ControlMainWindow() win.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
# -*- coding: utf-8 -*- from PySide import QtCore, QtGui class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(320, 240) self.centralwidget = QtGui.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget) self.verticalLayout.setObjectName("verticalLayout") self.doubleSpinBox = QtGui.QDoubleSpinBox(self.centralwidget) self.doubleSpinBox.setObjectName("doubleSpinBox") self.verticalLayout.addWidget(self.doubleSpinBox) self.doubleSpinBox_2 = QtGui.QDoubleSpinBox(self.centralwidget) self.doubleSpinBox_2.setObjectName("doubleSpinBox_2") self.verticalLayout.addWidget(self.doubleSpinBox_2) self.pushButton = QtGui.QPushButton(self.centralwidget) self.pushButton.setObjectName("pushButton") self.verticalLayout.addWidget(self.pushButton) self.label = QtGui.QLabel(self.centralwidget) self.label.setObjectName("label") self.verticalLayout.addWidget(self.label) spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) MainWindow.setCentralWidget(self.centralwidget) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8)) self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "PushButton", None, QtGui.QApplication.UnicodeUTF8)) self.label.setText(QtGui.QApplication.translate("MainWindow", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
Отредактировано Luke (Март 25, 2014 09:16:21)
Прикреплённый файлы:
form.py (2,1 KБ)
Офлайн
Столько людей использует Qt неужели никто не знает как сделать его удобным.
Например пытаюсь выделить всё содержимое doubleSpinBox при запуске программы таким кодом:
def __init__(self, parent=None): super(ControlMainWindow, self).__init__(parent) self.ui = Ui_MainWindow() self.ui.setupUi(self) self.ui.pushButton.clicked.connect(self.sum) self.ui.doubleSpinBox.setFocus() self.ui.doubleSpinBox.selectAll() #неработает ?
Офлайн
> переход между виджетами по клавише enter
Переопределяешь обработчик формы keyPressEvent.
def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Enter or event.key() == QtCore.Qt.Key_Return: self.focusNextPrevChild(True) else: event.accept()
self.ui.doubleSpinBox.setFocus(QtCore.Qt.FocusReason.MouseFocusReason)
Отредактировано Rodegast (Март 25, 2014 20:04:26)
Офлайн
def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Enter or event.key() == QtCore.Qt.Key_Return: self.focusNextPrevChild(True) else: event.accept()
self.ui.doubleSpinBox.setFocus(QtCore.Qt.FocusReason.MouseFocusReason)
def focusInEvent(self, event): if event.reason() == QtCore.Qt.MouseFocusReason: print 'focus'
Офлайн