I want to make my lineEdits turn red if they are empty when I click submit button. After adding something back I want to make my lineEdit turn back to white.
from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog
import sys, os
from PyQt5.uic import loadUi
from BlurWindow.blurWindow import blur
def input_validate(self,lineedit):
if self.lineedit.text() == '':
self.lineedit.setStyleSheet('''
QLineEdit{font: 15pt "Yu Gothic"; border-style:none; border-bottom:1px solid rgba(255,0,0,0.6); color:white;
}
QLineEdit:focus {
background-color:rgba(255,255,255,0.5);
} ''')
return False
else:
self.lineedit.setStyleSheet('''
QLineEdit{font: 15pt "Yu Gothic"; border-style:none; border-bottom:1px solid rgba(255,255,255,0.6); color:white;
}
QLineEdit:focus {
background-color:rgba(255,255,255,0.5);
} ''')
return True
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
loadUi(r'D:\Workspace\Qt Designer\blur bg\blurtest.ui',self)
self.setAttribute(Qt.WA_TranslucentBackground)
blur(self.winId())
self.setStyleSheet("background-color: rgba(0, 0, 0, 0)")
self.browse1.clicked.connect(self.browsefile1)
self.browse2.clicked.connect(self.browsefile2)
self.submit.clicked.connect(self.submit1)
self.setAttribute(Qt.WA_TranslucentBackground)
blur(self.winId())
self.setStyleSheet("background-color: rgba(0, 0, 0, 0)")
def browsefile1(self):
fname=QFileDialog.getOpenFileName(self,'Open File',os.getcwd())
self.lineEdit1.setText(fname[0])
def browsefile2(self):
fname=QFileDialog.getOpenFileName(self,'Open File',os.getcwd())
self.lineEdit2.setText(fname[0])
def submit1(self):
if not input_validate(self.lineEdit1) or not input_validate(self.lineEdit2):
return
print("successs")
app=QApplication(sys.argv)
mw=MainWindow()
mw.show()
sys.exit(app.exec_())
First I tried seperating this input_validate as a class :
class input_validate(QMainWindow):
def __init__(self):
super().__init__()
if self.lineEdit.text() == '':
self.lineEdit.setStyleSheet('''
QLineEdit{font: 15pt "Yu Gothic"; border-style:none; border-bottom:1px solid rgba(255,0,0,0.6); color:white;
}
QLineEdit:focus {
background-color:rgba(255,255,255,0.5);
} ''')
return False
else:
self.lineEdit.setStyleSheet('''
QLineEdit{font: 15pt "Yu Gothic"; border-style:none; border-bottom:1px solid rgba(255,255,255,0.6); color:white;
}
QLineEdit:focus {
background-color:rgba(255,255,255,0.5);
} ''')
return True
The error I got was
if not input_validate(self.lineEdit1) or not input_validate(self.lineEdit2):
TypeError: input_validate.init() takes 1 positional argument but 2 were given
So then I tried putting it inside the MainWindow class itself but this time it says if not input_validate(self.lineEdit1) or not input_validate(self.lineEdit2): NameError: name 'input_validate' is not defined
So I put it outside the MainWindow class to make it global and the first code block is what I have.
Now my error is if not input_validate(self.lineEdit1) or not input_validate(self.lineEdit2): TypeError: input_validate() missing 1 required positional argument: 'lineedit'
I don't know how can I solve this now. The long way would be to define the input_validate with linedit1 and lineedit2 separately but I want to figure out how can I reuse that code.
Also I wanted to know if it is ok to inherit QMainWindow instead of QWidget. This is supposed to be a one window thing for now with this as the first window to appear, so I selected it as a main window. Max it will have is a success popup or error popup message on clicking submit (which I guess I have to implement using QMessageBox)
CodePudding user response:
Your approach is way off and can be a little complex than it may seem. You can simply define a function in MainWindow
class for more simplicity and easier execution. In your first snippet of code, you have defined input_validate
outside of the class.
class MainWindow(QMainWindow):
... #Other stuff
self.submit.clicked.connect(self.input_validate) #Triggers the function created below
self.lineEdit.textChanged.connect(self.input_validate)
#It triggers whenever the text is changed in the lineEdit even with using setText,
#If you want to just check when the user changes it, you can use textEdited.
def input_validate(self):
if self.lineEdit.text() == '':
... #Set StyleSheet for Red
else:
... #Set StyleSheet for White
Also, the lineEdit
will turn to color Red if the user clears it. If you don't want it to happen you can add an argument in input_validate
, and return the function if the argument is True
so the function will not check for lineEdit.text()
.
And if you have to add parameters in connect
, you have to use lambda
, e.g.: self.lineEdit.textChanged.connect(lambda: input_validate())
.