2016-05-01 3 views
1

Код создает один диалог с QLineEdit и QPushButton. Когда кнопка нажата, я хочу, чтобы QLineEdit превратился в индикатор выполнения, который покажет ход процесса, вызванного нажатием кнопки. Когда процесс завершен, QLineEdit должен вернуться к своему нормальному виду «LineEdit». Как достичь этого?Как превратить фон QLineEdit в панель прогресса

enter image description here

Вот идея Photoshop-е изд:

enter image description here

бар прогресс может быть тонкая линия в нижней части QLineEdit: enter image description here

from PyQt4 import QtCore, QtGui 
import time 

class Dialog(QtGui.QDialog): 
    def __init__(self, parent=None): 
     QtGui.QDialog .__init__(self, parent) 
     mainLayout = QtGui.QVBoxLayout() 
     lineEdit = QtGui.QLineEdit('ITEM 001') 
     mainLayout.addWidget(lineEdit) 
     button = QtGui.QPushButton('Push Button') 
     button.clicked.connect(self.buttonClicked) 
     mainLayout.addWidget(button) 
     self.setLayout(mainLayout) 

    def buttonClicked(self): 
     print 'button clicked' 
     for i in range(3): 
      time.sleep(1) 
      print '...processing %s'%i 

if __name__ == '__main__': 
    app = QtGui.QApplication([]) 
    window = Dialog() 
    window.resize(300, 50) 
    window.show() 
    app.exec_() 
+0

Я думаю, что я хотел бы использовать метод setPalette из QLineEdit. Аналогично тому, как вы устанавливаете фон QLineEdit. Попробуйте найти, как установить фоны, используя, например, изображение. –

+0

Несомненно, это хорошая идея! Благодаря! – alphanumeric

ответ

2

В PyQt4 QLinearGradient получает горизонтальную ориентацию. В то время как PySide кажется, что это похоже на вертикальный градиент. Код создает QLineEdit с его цветом фона, установленным через palette.setBrush(QPalette.Base, QBrush(QLinearGradient)). Нажатие кнопки увеличивает значение индикатора выполнения на 10%.

enter image description here

from PyQt4 import QtCore, QtGui 
import time 


class Dialog(QtGui.QDialog): 
    value = 0.001 
    def __init__(self, parent=None): 
     QtGui.QDialog .__init__(self, parent) 
     mainLayout = QtGui.QVBoxLayout() 

     self.lineedit = QtGui.QLineEdit() 
     self.setValues() 
     mainLayout.addWidget(self.lineedit) 
     button = QtGui.QPushButton('Calculate') 
     button.clicked.connect(self.buttonClicked) 
     mainLayout.addWidget(button) 
     self.setLayout(mainLayout) 

    def setValues(self): 
     self.lineedit.setText('progress %s'%self.value) 
     palette = self.lineedit.palette() 
     QRectF = QtCore.QRectF(self.lineedit.rect()) 
     gradient = QtGui.QLinearGradient(QRectF.topLeft(), QRectF.topRight()) 
     gradient.setColorAt(self.value-0.001, QtGui.QColor('#f99e41')) 
     gradient.setColorAt(self.value, QtGui.QColor('#ffffff')) 
     gradient.setColorAt(self.value+0.001, QtGui.QColor('#ffffff')) 
     palette.setBrush(QtGui.QPalette.Base, QtGui.QBrush(gradient)) 
     self.lineedit.setPalette(palette) 

    def buttonClicked(self): 
     if self.value >0.9: 
      self.value = 0.001 
     else: 
      self.value=self.value+0.1 

     self.setValues() 
     time.sleep(1) 

if __name__ == '__main__': 
    app = QtGui.QApplication([]) 
    window = Dialog() 
    window.resize(300, 50) 
    window.show() 
    app.exec_() 

Для PySide, где градиент может быть горизонтальным:

import PySide.QtCore as QtCore 
import PySide.QtGui as QtGui 

class Dialog(QtGui.QDialog): 
    value = 1.00 
    def __init__(self, parent=None): 
     QtGui.QDialog .__init__(self, parent) 
     mainLayout = QtGui.QVBoxLayout() 

     self.lineedit = QtGui.QLineEdit() 
     self.setValues() 
     mainLayout.addWidget(self.lineedit) 
     button = QtGui.QPushButton('Calculate') 
     button.clicked.connect(self.buttonClicked) 
     mainLayout.addWidget(button) 
     self.setLayout(mainLayout) 

    def setValues(self): 
     self.lineedit.setText('progress %s'%self.value) 
     palette = self.lineedit.palette() 
     QRectF = QtCore.QRectF(self.lineedit.rect()) 
     gradient = QtGui.QLinearGradient(QRectF.topLeft(), QRectF.topRight()) 
     gradient.setColorAt(self.value-0.001, QtGui.QColor('#ffffff')) 
     gradient.setColorAt(self.value, QtGui.QColor('#f99e41')) 
     gradient.setColorAt(self.value+0.001, QtGui.QColor('#f99e41')) 
     palette.setBrush(QtGui.QPalette.Base, QtGui.QBrush(gradient)) 
     self.lineedit.setPalette(palette) 

    def buttonClicked(self): 
     if self.value <0.1: 
      self.value = 1.00 
     else: 
      self.value=self.value-0.1 

     self.setValues() 


if __name__ == '__main__': 
    app = QtGui.QApplication([]) 
    window = Dialog() 
    window.resize(300, 50) 
window.show() 
app.exec_() 
Смежные вопросы