问题
I have problem to access my button and label from my dialog.ui. I am using Python 3.x and QT Designer 5.x.
from PyQt5 import uic, QtWidgets
from PyQt5.QtWidgets import QApplication
Form, Window = uic.loadUiType("dialog.ui") #load ui (GUI) file
app = QApplication([]) #create a QApplication
window = Window()
form = Form()
form.setupUi(window)
def on_click():
# self.qlFreeText.text("hello")
alert = QMessageBox()
alert.setText("You clicked the button!")
alert.exec_()
class Ui(QtWidgets.QMainWindow):
def __init__(self):
super(Ui, self).__init__()
uic.loadUi('basic.ui',self)
# self.ButtonSearch = self.findChild(QtWidgets.QPushButton, 'qpbSearch')
self.ButtonSearch = self.findChild(QtWidgets.QObject, 'qpbSearch')
self.ButtonSearch.button.clicked.connect(self.printButtonPressed)
self.qlFreeText = self.findChild(QWidgets.QLabel, 'qlFreeText')
# self.show()
def printButtonPressed(self):
on_click()
window.show() #show window
app.exec_() #run application until user closes it
dialog.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<widget class="QDateEdit" name="dateStart">
<property name="geometry">
<rect>
<x>50</x>
<y>50</y>
<width>110</width>
<height>22</height>
</rect>
</property>
<property name="displayFormat">
<string>yyyy-MM-dd</string>
</property>
</widget>
<widget class="QDateEdit" name="dateEnd">
<property name="geometry">
<rect>
<x>220</x>
<y>50</y>
<width>110</width>
<height>22</height>
</rect>
</property>
<property name="displayFormat">
<string>yyyy-MM-dd</string>
</property>
</widget>
<widget class="QLabel" name="qlFreeText">
<property name="geometry">
<rect>
<x>120</x>
<y>140</y>
<width>55</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
<widget class="QPushButton" name="qpbSearch">
<property name="geometry">
<rect>
<x>190</x>
<y>220</y>
<width>93</width>
<height>28</height>
</rect>
</property>
<property name="text">
<string>PushButton</string>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>
When I click on the button, nothing happens. What I would like to try is, when I click on the button, than it changes the label text. But currently I can even not use the click on the button.
回答1:
You are confusing the following concepts:
You are creating the UI class where you create the connection but never use it. How do you think something works?
You don't need to use findChild() since if you use loadUi or loadUiType it will map the objects using the objectName.
Considering the above, the solutions are as follows:
loadUi():
from PyQt5 import uic, QtWidgets
class Ui(QtWidgets.QDialog):
def __init__(self):
super(Ui, self).__init__()
uic.loadUi("dialog.ui", self)
self.qpbSearch.clicked.connect(self.printButtonPressed)
def printButtonPressed(self):
self.qlFreeText.setText("hello")
alert = QtWidgets.QMessageBox()
alert.setText("You clicked the button!")
alert.exec_()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = Ui()
w.show() # show window
sys.exit(app.exec_())
loadUiType():
from PyQt5 import uic, QtWidgets
Form, _ = uic.loadUiType("dialog.ui")
class Ui(QtWidgets.QDialog, Form):
def __init__(self):
super(Ui, self).__init__()
self.setupUi(self)
self.qpbSearch.clicked.connect(self.printButtonPressed)
def printButtonPressed(self):
self.qlFreeText.setText("hello")
alert = QtWidgets.QMessageBox()
alert.setText("You clicked the button!")
alert.exec_()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = Ui()
w.show() # show window
sys.exit(app.exec_())
I recommend you check Using Qt Designer.
回答2:
from PyQt5 import QtWidgets, uic
import sys
def clicked_me():
print("You Clicked Me! :-)")
app = QtWidgets.QApplication([])
win = uic.loadUi("main_window.ui")
win.btn_start_capture.clicked.connect(clicked_me)
# My Button's Name is btn_start_capture
win.show()
sys.exit(app.exec())
来源:https://stackoverflow.com/questions/57461720/access-element-from-ui