Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt (PySide), выделение по щелчку, переход по enter, запятая в doubleSpinBox, фокус при запуске, вообщем удобное поведение формы. [RSS Feed]

#1 Март 24, 2014 17:58:55

Luke
От:
Зарегистрирован: 2010-11-29
Сообщения: 30
Репутация: +  3  -
Профиль   Отправить e-mail  

PyQt (PySide), выделение по щелчку, переход по enter, запятая в doubleSpinBox, фокус при запуске, вообщем удобное поведение формы.

Как реализовать удобное поведение 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 (Март 25, 2014 09:16:21)

Прикреплённый файлы:
attachment form.py (2,1 KБ)

Офлайн

#2 Март 25, 2014 16:09:43

Luke
От:
Зарегистрирован: 2010-11-29
Сообщения: 30
Репутация: +  3  -
Профиль   Отправить e-mail  

PyQt (PySide), выделение по щелчку, переход по enter, запятая в doubleSpinBox, фокус при запуске, вообщем удобное поведение формы.

Столько людей использует 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() #неработает ?
Но это не работает, почему ???



Офлайн

#3 Март 25, 2014 20:03:15

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2757
Репутация: +  184  -
Профиль   Отправить e-mail  

PyQt (PySide), выделение по щелчку, переход по enter, запятая в doubleSpinBox, фокус при запуске, вообщем удобное поведение формы.

> переход между виджетами по клавише 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)



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Март 25, 2014 20:04:26)

Офлайн

#4 Апрель 4, 2014 21:04:15

Luke
От:
Зарегистрирован: 2010-11-29
Сообщения: 30
Репутация: +  3  -
Профиль   Отправить e-mail  

PyQt (PySide), выделение по щелчку, переход по enter, запятая в doubleSpinBox, фокус при запуске, вообщем удобное поведение формы.

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'
неработает

Прошу выложите исправленный пример полностью.



Офлайн

  • Начало
  • » GUI
  • » PyQt (PySide), выделение по щелчку, переход по enter, запятая в doubleSpinBox, фокус при запуске, вообщем удобное поведение формы.[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version