Python Qt QlineEdit错误弹出/引出序号消息

Python Qt QlineEdit错误弹出/引出序号消息,python,qt,pyqt,pyqt4,pyside,Python,Qt,Pyqt,Pyqt4,Pyside,我正在尝试用python创建一个泛型类,该类将对qlineEdit(或其他小部件)中的输入执行一些错误检查,该类将弹出一个气球,告诉用户该条目无效。比如: 到目前为止,我已经做到了: 我真正的问题是:如何获得qlineEdit小部件的正确坐标以将引出序号放置在正确的位置?下面的代码应该将其放置在QlineEdit的左下角?它在底部,但不是左侧 当前代码: import sys from PyQt4 import QtGui, QtCore, uic class widgetErrorCh

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

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

我真正的问题是:如何获得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文件:testErrorMessage.ui


主窗口
0
0
493
348
主窗口
groupBox1
groupBoxA
LineEdit1
groupBoxB
LineEdit2
groupBox2
LineEdit3
0
0
493
21
文件
接近
actionClose
触发()
主窗口
关闭()
-1
-1
399
299

关于如何做得更好,还有其他想法吗


谢谢

因此,如果您手动遍历所有小部件的父部件,并将
pos()
相加,最后一个(窗口位置)除外,我将获得关于窗口的正确坐标

替换:

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

现在我可以在正确的位置获得
QLabel

该方法将调用者坐标系内的点映射到祖先小部件的坐标系

因此,结果如下:

    widget.mapTo(widget.parentWidget(), QPoint(0, 0))
完全等同于:

    widget.pos()
这意味着您可以使用“编辑”将标签放置在行的底部:

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

没有足够的代码来重现该问题。根据布局的不同,此代码有时似乎工作不正确。您能发布用于创建表单的代码(以及UI文件,如果有的话)并将
widgeterrorching
添加到表单中吗?@PavelStrakhov我将尝试复制它。当前的UI文件和代码非常庞大。。。我正试图创建这个对话框的小部件在布局/小部件结构中非常深入。窗口布局是一个
QVerticalLayout
,然后是一个带有
QGridLayout
QTabWidget
,然后是一个带有上一个
QGridLayout
中另一个
QLineEdit
QFrame
    widget.pos()
    self.move(self.widget.mapTo(
        self.parentWidget(), self.widget.rect().bottomLeft()))