Уведомления

Группа в Telegram: @pythonsu

#1 Май 4, 2016 15:03:58

Lestoroer
Зарегистрирован: 2015-12-24
Сообщения: 88
Репутация: +  5  -
Профиль   Отправить e-mail  

PySide and PyQt setPlaceholderText

Раньше делал программы на PyQt и у однострочного текстового поля (QLineEdit) мне нравилась работа метода setPlaceholderText. Суть была в том, что когда текстовое поле пустое и имеет на себе фокус, то выводилась подсказка пользователю в виде текста.
Сейчас зашел и попробовал это сделать в PySide, так вот, сразу же отметилась разница в работе одного и того же метода. Если поле пустое и фокус установлен на поле, то PySide не выводит подсказку пользователю, так, как это делал PyQt.
Как сделать так, чтобы setPlaceholderText начал адекватно работать в PySide?
Тут что-то связано с переопределением методов, так вот, я вообще не понимаю как это сделать.

Офлайн

#2 Май 5, 2016 10:25:16

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

PySide and PyQt setPlaceholderText

Lestoroer
то PySide не выводит подсказку пользователю, так, как это делал PyQt.
один и тот же код? странно это
setTooltip еще есть, но работает иначе

Отредактировано vic57 (Май 5, 2016 10:31:32)

Офлайн

#3 Май 5, 2016 13:53:07

Lestoroer
Зарегистрирован: 2015-12-24
Сообщения: 88
Репутация: +  5  -
Профиль   Отправить e-mail  

PySide and PyQt setPlaceholderText

Да, именно так, вот код:

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.window()
    def window (self):
        self.setWindowTitle('PyQt or PySide')
        line = QLineEdit()
        line.setPlaceholderText('Отображаемый текст')
        vbox = QHBoxLayout()
        vbox.addWidget(line)
        self.setLayout(vbox)
if __name__ == '__main__':
    import sys 
    app = QApplication(sys.argv) 
    window = MyWindow()
    window.show()
    sys.exit(app.exec_()) 
Результаты нахождения компонентов в фокусе приведены на скриншоте. PyQt показывает подсказку - PySide - нет, непонятно, зачем вообще было так делать, кому теперь этот setPlaceHolderText в PySide нужен.
setToolTip погляжу попозже.
\\\Добавлено позже : setToolTip - это просто всплывающая подсказка, мне этот метод не подходит.

Отредактировано Lestoroer (Май 5, 2016 14:51:32)

Прикреплённый файлы:
attachment проблема PySide.png (3,1 KБ)

Офлайн

#4 Май 5, 2016 16:17:35

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

PySide and PyQt setPlaceholderText

http://pyside.github.io/docs/pyside/PySide/QtGui/QLineEdit.html#PySide.QtGui.PySide.QtGui.QLineEdit.setPlaceholderText
судя по ссылке должно работать

#-*-coding:utf8-*-
from PySide.QtGui import *
from PySide.QtCore import *
class MyWindow(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.window()
    def window (self):
        self.setWindowTitle('PyQt or PySide')
        line = QLineEdit()
        line.setPlaceholderText(u'Отображаемый текст')
        vbox = QHBoxLayout()
        vbox.addWidget(line)
        self.setLayout(vbox)
if __name__ == '__main__':
    import sys 
    app = QApplication(sys.argv) 
    w = MyWindow()
    w.move(0,0)
    w.show()
    sys.exit(app.exec_()) 
у меня работает

Отредактировано vic57 (Май 5, 2016 16:33:47)

Офлайн

#5 Май 5, 2016 16:54:09

Lestoroer
Зарегистрирован: 2015-12-24
Сообщения: 88
Репутация: +  5  -
Профиль   Отправить e-mail  

PySide and PyQt setPlaceholderText

vic57
http://pyside.github.io/docs/pyside/PySide/QtGui/QLineEdit.html#PySide.QtGui.PySide.QtGui.QLineEdit.setPlaceholderTextсудя по ссылке должно работать
Когда отводишь фокус с окна, тогда появляется надпись в PySide, если наводишь фокус - то исчезает. В принципе так и прописано в доке, именно так и должен работать этот метод, однако, в PyQt при наведении фокуса, надпись не исчезает. Хочу, чтобы в PySide работало также как и в PyQt - это очень удобно, ведь строка информирует пользователя. Нужно как-то переопределить этот setPlaceHolderText, но сегодня я готовлюсь к электроснабжению, поэтому с этим завтра буду разбираться.

Офлайн

#6 Май 5, 2016 17:34:14

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

PySide and PyQt setPlaceholderText

в моем коде поменял PySide на PyQt4, абсолютно одинаково рвботает.
дело конечно ваше, ИМХО не там копаете

Отредактировано vic57 (Май 5, 2016 17:35:53)

Офлайн

#7 Май 5, 2016 20:53:52

Lestoroer
Зарегистрирован: 2015-12-24
Сообщения: 88
Репутация: +  5  -
Профиль   Отправить e-mail  

PySide and PyQt setPlaceholderText

vic57
в моем коде поменял PySide на PyQt4, абсолютно одинаково рвботает.дело конечно ваше, ИМХО не там копаете
У меня PyQt5. Не знаю, почему-то вот так работает (мне что видео записывать, не верите?). А у вас при наведении фокуса надпись остается или исчезает?(когда поле пустое)

Отредактировано Lestoroer (Май 5, 2016 21:01:37)

Офлайн

#8 Май 6, 2016 03:38:46

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

PySide and PyQt setPlaceholderText

при получении фокуса ввода исчезает, при переводе фокуса появляется снова(по клавише Tab например)

#-*-coding:utf8-*-
from PySide.QtGui import *
from PySide.QtCore import *
class MyWindow(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.setWindowTitle('PyQt or PySide')
        line = QLineEdit()
        line.setPlaceholderText(u'Отображаемый текст')
        line1 = QLineEdit()
        line1.setPlaceholderText(u'Отображаемый текст 1')
        box = QSpinBox()
        btn = QPushButton('Push')
        vbox = QVBoxLayout(self)
        vbox.addWidget(line)
        vbox.addWidget(line1)
        vbox.addWidget(box)
        vbox.addWidget(btn)
        self.setFocus()
if __name__ == '__main__':
    import sys 
    app = QApplication(sys.argv) 
    w = MyWindow()
    w.move(0,0)
    w.show()
    sys.exit(app.exec_()) 

Офлайн

#9 Май 7, 2016 21:35:42

Lestoroer
Зарегистрирован: 2015-12-24
Сообщения: 88
Репутация: +  5  -
Профиль   Отправить e-mail  

PySide and PyQt setPlaceholderText

Захотел я в общем перерисовать стандартный QLineEdit.

class ClineEdit(QLineEdit):
    def paintEvent(self, event):
        qp = QPainter()
        qp.begin(self)
        #Цвета текста и фона
        qp.setPen(QColor(255,255,255))
        qp.setBrush(QColor(20,200,255))
        #Рисуем рамку для QLineEdit
        qp.drawRect(QRect(0,0,132,19))
        #Рисуем текст
        qp.drawText(event.rect(), Qt.AlignRight, 'QT')
        qp.end() 
class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.window()
    def window (self):
        self.setWindowTitle('lol') 
        self.resize(270, 100)
        cline = ClineEdit()
        #Выравнивнивание и отображение на QWidget
        vbox = QHBoxLayout()
        vbox.addWidget(cline)
        self.setLayout(vbox)
if __name__ == '__main__':
    import sys 
    app = QApplication(sys.argv) 
    window = MyWindow() 
    window.show() 
    sys.exit(app.exec_()) 
Код выше некорректно работает. Вводимый текст пользователем вообще не отображает, почему то два текста “Qt”. (попробуйте у себя запустить). Я так понял, там QlineEdit на QlineEdit наложились. Нужно, чтобы был перерисованный QLineEdit поверх которого надпись Qt, и, также пользовать мог вводить текст с клавиатуры и он отображался. Если решу эту проблему(кто-нибудь может поможет или до самого дойдет), решу проблемы с placeholdertext. Что я сделал не так, кто может подсказать?
P.S. Я понимаю, что цвет фона и цвет рамки можно задать по другому, через setPalette или setStyleSheet, но меня интересует изменение этих параметров именно через paintEvent, ведь с помощью paintEvent можно и скругленные поля сделать и еще много интересных приблуд.

Отредактировано Lestoroer (Май 7, 2016 22:03:00)

Офлайн

#10 Май 7, 2016 22:59:27

Lestoroer
Зарегистрирован: 2015-12-24
Сообщения: 88
Репутация: +  5  -
Профиль   Отправить e-mail  

PySide and PyQt setPlaceholderText

Сделал. Помог старый добрый QLabel. Сделал очень плохо и криво, но хотя бы так. Долго не мог с этим справиться. Буду ждать ответов по поводу paintEvent и по выравниванию QLabel в QlineEdit (у меня почему-то оно не задается, приходиться текст подсказки по абсолютной системe выставлять…)
Также напоминаю, что осуществлен метод, который выводит текст подсказки, когда текстовое поле находится в фокусе/без фокуса и не имеет теста внутри себя
Код:

class CLineEdit(QLineEdit):
    def place(self, holder):
        self.holder = holder
        self.qp = QPalette()
        self.qp.setColor(QPalette.All, QPalette.Text, QColor('gray'))
        self.setPalette(self.qp)
        self.placeholder = QLabel(self.holder,self)
        self.placeholder.move(3,4)
        self.textChanged.connect(self.textChange)
    def textChange(self):
        if self.text() == '':
            qp = QPalette()
            qp.setColor(QPalette.All, QPalette.Text, QColor('gray'))
            self.setPalette(qp)
            self.placeholder.setText(self.holder)
            self.placeholder.show()
        else:
            self.qp = QPalette()
            self.qp.setColor(QPalette.All, QPalette.Text, QColor('black'))
            self.setPalette(self.qp)
            self.placeholder.hide()
class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.window()
    def window (self):
        self.setWindowTitle('lol') 
        self.resize(270, 100)
        #Создаем объект унаследованный от QLineEdit
        cline = ClineEdit()
        #Текст подсказки
        cline.place('Да это ужас какой-то')
        #Выравнивнивание и отображение на QWidget
        vbox = QHBoxLayout()
        vbox.addWidget(cline)
        self.setLayout(vbox)
if __name__ == '__main__':
    import sys 
    app = QApplication(sys.argv) 
    window = MyWindow() 
    window.show() 
    sys.exit(app.exec_()) 

Отредактировано Lestoroer (Май 10, 2016 18:52:51)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version