Найти - Пользователи
Полная версия: PyQt (PySide), выделение по щелчку, переход по enter, запятая в doubleSpinBox, фокус при запуске, вообщем удобное поведение формы.
Начало » GUI » PyQt (PySide), выделение по щелчку, переход по enter, запятая в doubleSpinBox, фокус при запуске, вообщем удобное поведение формы.
1
Luke
Как реализовать удобное поведение 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()

Сгенерированная Qt Designer форма примера:
# -*- 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
Столько людей использует 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() #неработает ?
Но это не работает, почему ???
Rodegast
> переход между виджетами по клавише 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()

> выделение содержимого при щелчке мыши в doubleSpinBox
Аналогично. Смотришь в сторону обработчика focusInEvent.

> self.ui.doubleSpinBox.selectAll() #неработает ?
self.ui.doubleSpinBox.setFocus(QtCore.Qt.FocusReason.MouseFocusReason)

Luke
def keyPressEvent(self, event):
    if event.key() == QtCore.Qt.Key_Enter or event.key() == QtCore.Qt.Key_Return:
        self.focusNextPrevChild(True)
    else: event.accept()
вызывает переход только между doubleSpinBox_ми, на кнопку не переходит.

self.ui.doubleSpinBox.setFocus(QtCore.Qt.FocusReason.MouseFocusReason)
просто устанавливает фокус, ничего не выделяет

    def focusInEvent(self, event):
        if event.reason() == QtCore.Qt.MouseFocusReason:
            print 'focus'
неработает

Прошу выложите исправленный пример полностью.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB