Форум сайта python.su
Раньше делал программы на PyQt и у однострочного текстового поля (QLineEdit) мне нравилась работа метода setPlaceholderText. Суть была в том, что когда текстовое поле пустое и имеет на себе фокус, то выводилась подсказка пользователю в виде текста.
Сейчас зашел и попробовал это сделать в PySide, так вот, сразу же отметилась разница в работе одного и того же метода. Если поле пустое и фокус установлен на поле, то PySide не выводит подсказку пользователю, так, как это делал PyQt.
Как сделать так, чтобы setPlaceholderText начал адекватно работать в PySide?
Тут что-то связано с переопределением методов, так вот, я вообще не понимаю как это сделать.
Офлайн
Lestoroerодин и тот же код? странно это
то PySide не выводит подсказку пользователю, так, как это делал PyQt.
Отредактировано vic57 (Май 5, 2016 10:31:32)
Офлайн
Да, именно так, вот код:
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_())
Отредактировано Lestoroer (Май 5, 2016 14:51:32)
Прикреплённый файлы: проблема PySide.png (3,1 KБ)
Офлайн
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)
Офлайн
vic57Когда отводишь фокус с окна, тогда появляется надпись в PySide, если наводишь фокус - то исчезает. В принципе так и прописано в доке, именно так и должен работать этот метод, однако, в PyQt при наведении фокуса, надпись не исчезает. Хочу, чтобы в PySide работало также как и в PyQt - это очень удобно, ведь строка информирует пользователя. Нужно как-то переопределить этот setPlaceHolderText, но сегодня я готовлюсь к электроснабжению, поэтому с этим завтра буду разбираться.
http://pyside.github.io/docs/pyside/PySide/QtGui/QLineEdit.html#PySide.QtGui.PySide.QtGui.QLineEdit.setPlaceholderTextсудя по ссылке должно работать
Офлайн
в моем коде поменял PySide на PyQt4, абсолютно одинаково рвботает.
дело конечно ваше, ИМХО не там копаете
Отредактировано vic57 (Май 5, 2016 17:35:53)
Офлайн
vic57У меня PyQt5. Не знаю, почему-то вот так работает (мне что видео записывать, не верите?
в моем коде поменял PySide на PyQt4, абсолютно одинаково рвботает.дело конечно ваше, ИМХО не там копаете
Отредактировано Lestoroer (Май 5, 2016 21:01:37)
Офлайн
при получении фокуса ввода исчезает, при переводе фокуса появляется снова(по клавише 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_())
Офлайн
Захотел я в общем перерисовать стандартный 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_())
Отредактировано Lestoroer (Май 7, 2016 22:03:00)
Офлайн
Сделал. Помог старый добрый 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)
Офлайн