我试图在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文件:测试错误消息.ui
^{pr2}$有没有其他更好的办法?在
谢谢!在
因此,如果您手动遍历小部件的所有父对象,并将
pos()
相加,除了最后一个(窗口位置),我就得到了引用window的正确坐标。在替换:
有:
^{pr2}$现在我可以把
QLabel
放在正确的地方!在QWidget.mapTo方法将调用者坐标系内的一个点映射到祖先小部件的坐标系。在
所以结果是:
完全等同于:
^{pr2}$这意味着您可以使用以下命令将标签放在编辑行的底部:
相关问题 更多 >
编程相关推荐