Как удалить фокус из QLineEdit, когда где-то еще нажали на окно PyQt5

#python-3.x #pyqt5 #qlineedit

#python-3.x #pyqt5 #qlineedit

Вопрос:

Проблема

Я хочу убрать фокус, QLineEdit когда я нажимаю где-то еще в окне.
Я использую PyQt5 в Python 3.9.7 в Windows 10. Я также искал об этом в Google, youtube и stackoverflow. Но, похоже, api устарел / не для PyQt5.

Код

Я создавал средство сокращения URL только для образовательных целей (Cz Я новичок:)
, И я использую свой собственный класс Entrybox , который является родительским для QLineEdit Here is the code:

 from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox
from requests import get
from pyperclip import copy
from keyboard import add_hotkey


class Entrybox(QtWidgets.QLineEdit):
    pass

class Ui_window(object):
    def setupUi(self, window):
        self.win=window
        self.win.setFixedSize(400, 247)
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei")
        font.setPointSize(10)
        window.setFont(font)
        window.setAutoFillBackground(False)
        window.setStyleSheet("background-color: #484848;")
        window.setUnifiedTitleAndToolBarOnMac(False)
        self.centralwidget = QtWidgets.QWidget(window)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(0, 10, 400, 31))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei")
        font.setPointSize(20)
        self.label.setFont(font)
        self.label.setStyleSheet("color:#fff;")
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.boxurl = Entrybox(self.centralwidget)
        self.boxurl.setGeometry(QtCore.QRect(10, 60, 380, 31))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei")
        font.setPointSize(12)
        self.boxurl.setFont(font)
        self.boxurl.setStyleSheet("Entrybox {n"
        "background-color: #595959;n"
        "border:0px;n"
        "color:#ffffff;n"
        "selection-color: #ffffff;n"
        "selection-background-color: #484848;n"
        "border-radius: 15px;n"
        "}n"
        "Entrybox:hover {n"
        "background-color: #636363;n"
        "}n"
        "Entrybox:focus {n"
        "background-color: #636363;n"
        "}")
        self.boxurl.setAlignment(QtCore.Qt.AlignCenter)
        self.boxurl.setObjectName("boxurl")
        self.gobtn = QtWidgets.QPushButton(self.centralwidget)
        self.gobtn.setGeometry(QtCore.QRect(160, 160, 81, 41))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei")
        font.setPointSize(15)
        font.setBold(True)
        font.setWeight(75)
        self.gobtn.setFont(font)
        self.gobtn.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.gobtn.setStyleSheet("QPushButton {n"
        "background-color: #505050;n"
        "border:0px;n"
        "color:#ffffff;n"
        "border-radius:15px;n"
        "}n"
        "QPushButton:hover {n"
        "background-color: #595959;n"
        "}n"
        "QPushButton:pressed {n"
        "background-color: #636363;n"
        "}")
        self.gobtn.setObjectName("gobtn")
        self.boxname = Entrybox(self.centralwidget)
        self.boxname.setGeometry(QtCore.QRect(10, 110, 380, 31))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei")
        font.setPointSize(12)
        self.boxname.setFont(font)
        self.boxname.setStyleSheet("Entrybox {n"
        "background-color: #595959;n"
        "border:0px;n"
        "color:#ffffff;n"
        "selection-color: #ffffff;n"
        "selection-background-color: #484848;n"
        "border-radius: 15px;n"
        "}n"
        "Entrybox:hover {n"
        "background-color: #636363;n"
        "}n"
        "Entrybox:focus {n"
        "background-color: #636363;n"
        "}")
        self.boxname.setAlignment(QtCore.Qt.AlignCenter)
        self.boxname.setObjectName("boxname")
        self.status = QtWidgets.QLabel(self.centralwidget)
        self.status.setGeometry(QtCore.QRect(0, 210, 400, 31))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei")
        font.setPointSize(15)
        self.status.setFont(font)
        self.status.setStyleSheet("color:#fff;")
        self.status.setAlignment(QtCore.Qt.AlignCenter)
        self.status.setObjectName("status")
        self.titlelabel = QtWidgets.QLabel(self.centralwidget)
        self.titlelabel.setGeometry(QtCore.QRect(10, 250, 36, 31))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei")
        font.setPointSize(12)
        self.titlelabel.setFont(font)
        self.titlelabel.setStyleSheet("color:#fff;")
        self.titlelabel.setObjectName("titlelabel")
        self.boxtitle = Entrybox(self.centralwidget)
        self.boxtitle.setGeometry(QtCore.QRect(55, 250, 336, 31))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei")
        font.setPointSize(12)
        self.boxtitle.setFont(font)
        self.boxtitle.setStyleSheet("Entrybox {n"
        "background-color: #595959;n"
        "border:0px;n"
        "color:#ffffff;n"
        "selection-color: #ffffff;n"
        "selection-background-color: #484848;n"
        "border-radius: 15px;n"
        "}n"
        "Entrybox:hover {n"
        "background-color: #636363;n"
        "}n"
        "Entrybox:focus {n"
        "background-color: #636363;n"
        "}")
        self.boxtitle.setAlignment(QtCore.Qt.AlignCenter)
        self.boxtitle.setObjectName("boxtitle")
        self.urllabel = QtWidgets.QLabel(self.centralwidget)
        self.urllabel.setGeometry(QtCore.QRect(10, 300, 99, 31))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei")
        font.setPointSize(12)
        self.urllabel.setFont(font)
        self.urllabel.setStyleSheet("color:#fff;")
        self.urllabel.setObjectName("urllabel")
        self.boxshorturl = Entrybox(self.centralwidget)
        self.boxshorturl.setGeometry(QtCore.QRect(115, 300, 277, 31))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei")
        font.setPointSize(12)
        self.boxshorturl.setFont(font)
        self.boxshorturl.setStyleSheet("Entrybox {n"
        "background-color: #595959;n"
        "border:0px;n"
        "color:#ffffff;n"
        "selection-color: #ffffff;n"
        "selection-background-color: #484848;n"
        "border-radius: 15px;n"
        "}n"
        "Entrybox:hover {n"
        "background-color: #636363;n"
        "}n"
        "Entrybox:focus {n"
        "background-color: #636363;n"
        "}")
        self.boxshorturl.setAlignment(QtCore.Qt.AlignCenter)
        self.boxshorturl.setObjectName("boxshorturl")
        self.copybtn = QtWidgets.QPushButton(self.centralwidget)
        self.copybtn.setGeometry(QtCore.QRect(160, 340, 81, 41))
        font = QtGui.QFont()
        font.setFamily("Microsoft YaHei")
        font.setPointSize(15)
        font.setBold(True)
        font.setWeight(75)
        self.copybtn.setFont(font)
        self.copybtn.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.copybtn.setStyleSheet("QPushButton {n"
        "background-color: #505050;n"
        "border:0px;n"
        "color:#ffffff;n"
        "border-radius:15px;n"
        "}n"
        "QPushButton:hover {n"
        "background-color: #595959;n"
        "}n"
        "QPushButton:pressed {n"
        "background-color: #636363;n"
        "}")
        self.copybtn.setObjectName("copybtn")
        window.setFocus()
        window.setCentralWidget(self.centralwidget)


        self.retranslateUi(window)
        self.UiSetup()
        QtCore.QMetaObject.connectSlotsByName(window)

    def retranslateUi(self, window):
        _translate = QtCore.QCoreApplication.translate
        window.setWindowTitle(_translate("window", "URL Shortener Online"))
        self.label.setText(_translate("window", "URL Shortener Online"))
        self.gobtn.setText(_translate("window", "Go"))
        self.status.setText(_translate("window", ""))
        self.titlelabel.setText(_translate("window", "Title:"))
        self.urllabel.setText(_translate("window", "Shorten URL:"))
        self.copybtn.setText(_translate("window", "Copy"))


    def UiSetup(self):
        add_hotkey('ctrl   c', self.copylink)
        self.boxurl.setPlaceholderText('Enter Long URL')
        self.boxname.setPlaceholderText('Enter Alias/Name (Optional)')
        self.gobtn.clicked.connect(self.shortenit)
        self.copybtn.clicked.connect(self.copylink)
        self.titlelabel.setHidden(True)
        self.boxtitle.setHidden(True)
        self.urllabel.setHidden(True)
        self.boxshorturl.setHidden(True)
        self.copybtn.setHidden(True)

    def showwarning(self,message,title='Error') -> str:
        msg = QMessageBox()
        msg.setIcon(QMessageBox.Critical)
        msg.setText(message)
        msg.setWindowTitle(title)
        msg.exec_()

    def shortenit(self):
        url=self.boxurl.text()
        if 'http' not in url:
            url='http://' url
        name=self.boxname.text()
        if name=='':
            api_url=f"https://cutt.ly/api/api.php?key=667cc3506cc77adad0b8503f2dfc8a2121930amp;short={url}"
        else:
            api_url=f'https://cutt.ly/api/api.php?key=667cc3506cc77adad0b8503f2dfc8a2121930amp;short={url}amp;name={name}'
        try:
            link=get(api_url).json()['url']
        except:
            self.showwarning('Please check your Internet Connection')
            return
        self.linkstatus=link['status']
        if self.linkstatus==7:
            self.status.setText('Done!')
            pass
        elif self.linkstatus==3:
            self.showwarning('Alias/Name is already taken')
            return
        elif self.linkstatus==2:
            self.showwarning('URL is Invalid or not supported')
            return
        elif self.linkstatus==5:
            self.showwarning('Entered Alias/Name in not supported')
            return
        else:
            self.showwarning('Something went wrong!')
            return
        
        self.shortlink=link['shortLink']
        self.title=link['title']
        self.titlelabel.setHidden(False)
        self.boxtitle.setHidden(False)
        self.urllabel.setHidden(False)
        self.boxshorturl.setHidden(False)
        self.copybtn.setHidden(False)
        self.win.setFixedSize(400,400)
        self.boxtitle.setText(self.title)
        self.boxshorturl.setText(self.shortlink)

    def copylink(self):
        try:
            copy(self.shortlink)
        except:
            pass

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = QtWidgets.QMainWindow()
    ui = Ui_window()
    ui.setupUi(window)
    window.show()
    sys.exit(app.exec_())
 

Комментарии:

1. Вы включили свой cutt. ly ключ API в вопросе. Возможно, это то, чего вы не хотели делать. Если да, то вы можете захотеть изменить свой ключ?

2. Спасибо. Но это API поддельной учетной записи, проверенный с помощью temp mail

3. Вы также, по-видимому, проигнорировали предупреждение в файле pyuic, который вы пытаетесь отредактировать, что должно явно указывать вам не изменять его. Хотя это не имеет прямого отношения к вашей проблеме, это все еще проблема. Пожалуйста, прочтите подробнее об использовании Конструктора .

4. почему вы не используете qt designer для настройки своего пользовательского интерфейса? так много закодированных вручную вещей, которые могут пойти не так. пусть qt designer сделает всю работу за вас. У меня никогда не было таких проблем.

5. Да, чувак! Я создал этот графический интерфейс с помощью Qt Designer. Затем преобразовал его в Python с помощью pyuic5. И еще одна вещь, эта проблема по умолчанию. Cz Я видел это, когда запускал его в Qt Designer. И я не редактировал функции setupUi и retranslateUi по умолчанию. Я только что добавил еще 4 функции.