Найти - Пользователи
Полная версия: PySide and PyQt setPlaceholderText
Начало » GUI » PySide and PyQt setPlaceholderText
1 2
Lestoroer
Раньше делал программы на PyQt и у однострочного текстового поля (QLineEdit) мне нравилась работа метода setPlaceholderText. Суть была в том, что когда текстовое поле пустое и имеет на себе фокус, то выводилась подсказка пользователю в виде текста.
Сейчас зашел и попробовал это сделать в PySide, так вот, сразу же отметилась разница в работе одного и того же метода. Если поле пустое и фокус установлен на поле, то PySide не выводит подсказку пользователю, так, как это делал PyQt.
Как сделать так, чтобы setPlaceholderText начал адекватно работать в PySide?
Тут что-то связано с переопределением методов, так вот, я вообще не понимаю как это сделать.
vic57
Lestoroer
то PySide не выводит подсказку пользователю, так, как это делал PyQt.
один и тот же код? странно это
setTooltip еще есть, но работает иначе
Lestoroer
Да, именно так, вот код:
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 - это просто всплывающая подсказка, мне этот метод не подходит.
vic57
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_()) 
у меня работает
Lestoroer
vic57
http://pyside.github.io/docs/pyside/PySide/QtGui/QLineEdit.html#PySide.QtGui.PySide.QtGui.QLineEdit.setPlaceholderTextсудя по ссылке должно работать
Когда отводишь фокус с окна, тогда появляется надпись в PySide, если наводишь фокус - то исчезает. В принципе так и прописано в доке, именно так и должен работать этот метод, однако, в PyQt при наведении фокуса, надпись не исчезает. Хочу, чтобы в PySide работало также как и в PyQt - это очень удобно, ведь строка информирует пользователя. Нужно как-то переопределить этот setPlaceHolderText, но сегодня я готовлюсь к электроснабжению, поэтому с этим завтра буду разбираться.
vic57
в моем коде поменял PySide на PyQt4, абсолютно одинаково рвботает.
дело конечно ваше, ИМХО не там копаете
Lestoroer
vic57
в моем коде поменял PySide на PyQt4, абсолютно одинаково рвботает.дело конечно ваше, ИМХО не там копаете
У меня PyQt5. Не знаю, почему-то вот так работает (мне что видео записывать, не верите?). А у вас при наведении фокуса надпись остается или исчезает?(когда поле пустое)
vic57
при получении фокуса ввода исчезает, при переводе фокуса появляется снова(по клавише 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_()) 
Lestoroer
Захотел я в общем перерисовать стандартный 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
Сделал. Помог старый добрый 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_()) 
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