Qt QlineEdit错误弹出/气泡式消息

2024-10-01 07:11:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在python中创建一个泛型类,它将对qlineEdit(或其他小部件)中的输入进行错误检查,它将弹出一个气球,告诉用户该条目无效。比如:

enter image description here

到目前为止,我已经做到了:

enter image description here

我真正的问题是:如何获得qlineEdit小部件的正确坐标,以将气球放置在正确的位置?下面的代码应该把它放在QlineEdit的左下角?它在底部,但不是左手边。在


当前代码:

import sys
from PyQt4 import QtGui, QtCore, uic

class widgetErrorChecking(QtGui.QLabel):
    def __init__(self, parent, widget, app):
        QtGui.QLabel.__init__(self, parent)

        self.widget = widget

        self.hide()

        effect = QtGui.QGraphicsDropShadowEffect()
        effect.setBlurRadius(10)
        effect.setOffset(2,2)
        self.setGraphicsEffect(effect)

        self.setStyleSheet('''QLabel {
                                 background-color:red;
                                 border: darkRed;
                                 border-radius: 5px;
                                 }
                           ''')

        if isinstance(widget, QtGui.QLineEdit):
            widget.textEdited.connect(self.checkWidgetValue)

        app.focusChanged.connect(self.hide)

    def checkWidgetValue(self, value):
        if not value:
            return

        try:
            value = float(value)
        except ValueError:
            value = 0.0

        if 0.0 >value:
            self.showMessage('Needs to be greater then 0.0')
        elif value>100:
            self.showMessage('Needs to be less then 100.0')
        else:
            self.hide()

    def showMessage(self, message = None):
        '''
        Show the widget.
        '''
        self.setText(message)
        self.adjustSize()
        self.update()
        self.show()

        labelGeo = self.geometry()

        # vvvv whats wrong with this vvvv
        widgetPos = self.widget.mapTo(self.parent(), self.widget.pos())

        widgetGeo = self.widget.geometry()
        newPos = QtCore.QPoint(widgetPos.x(), widgetPos.y()+widgetGeo.height())
        self.move(newPos)

class mainWindow(QtGui.QMainWindow):
    '''
    Main window class handeling all gui interactions
    '''
    def __init__(self, app):
        QtGui.QMainWindow.__init__(self)
        self.app = app
        self.ui =  uic.loadUi('testErrorMessage.ui', self)

        # Add error checking
        errorChecker1 = widgetErrorChecking(self, self.ui.lineEdit1, self.app)
        errorChecker2 = widgetErrorChecking(self, self.ui.lineEdit2, self.app)
        errorChecker3 = widgetErrorChecking(self, self.ui.lineEdit3, self.app)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)

    gui = mainWindow(app)
    gui.show()
    app.exec_()

    app.deleteLater()
    sys.exit()

ui文件:测试错误消息.ui

^{pr2}$

有没有其他更好的办法?在

谢谢!在


Tags: selfappuiifinitvaluedefsys
2条回答

因此,如果您手动遍历小部件的所有父对象,并将pos()相加,除了最后一个(窗口位置),我就得到了引用window的正确坐标。在

替换:

widgetPos = self.widget.mapTo(self.parent(), self.widget.pos())

有:

^{pr2}$

现在我可以把QLabel放在正确的地方!在

QWidget.mapTo方法将调用者坐标系内的一个点映射到祖先小部件的坐标系。在

所以结果是:

    widget.mapTo(widget.parentWidget(), QPoint(0, 0))

完全等同于:

^{pr2}$

这意味着您可以使用以下命令将标签放在编辑行的底部:

    self.move(self.widget.mapTo(
        self.parentWidget(), self.widget.rect().bottomLeft()))

相关问题 更多 >