Python Qt QlineEdit错误弹出/引出序号消息
我正在尝试用python创建一个泛型类,该类将对qlineEdit(或其他小部件)中的输入执行一些错误检查,该类将弹出一个气球,告诉用户该条目无效。比如: 到目前为止,我已经做到了: 我真正的问题是:如何获得qlineEdit小部件的正确坐标以将引出序号放置在正确的位置?下面的代码应该将其放置在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
当前代码:
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()))