【发布时间】:2015-06-30 20:20:37
【问题描述】:
我创建了一个自定义按钮类,我希望将其添加到使用 QT Designer 创建的布局中。
这是第一个类的init函数:
class Ui_Form(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.setupUi(self)
self.button1 = Button()
self.button1.clicked.connect(self.button1.playSample)
这是它调用的按钮类:
class Button(QtGui.QPushButton):
def __init__(self):
super(Button, self).__init__()
self.setAcceptDrops(True)
self.setGeometry(QtCore.QRect(90, 90, 61, 51))
self.setText("Drag onto Me")
问题是我不知道如何以显示 QT Designer 创建的按钮的方式显示此按钮类。
按钮目前通过以下方式添加到 Ui_Form 类的 setupUi 函数中(它们没有添加到布局管理器中,所以我假设“表单”与它有关,但我只是不知道该怎么做做!):
self.btn_b8 = QtGui.QPushButton(Form)
self.btn_b8.setGeometry(QtCore.QRect(440, 90, 61, 51))
self.btn_b8.setText("")
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("Python/LP_Proj/LP_Square_Off.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.btn_b8.setIcon(icon)
self.btn_b8.setIconSize(QtCore.QSize(55, 55))
self.btn_b8.setObjectName("btn_b8")
这是一个简单的代码示例(尽可能小),它描述了一个按钮工作,而我试图创建的按钮没有显示出来。我不知道如何使用布局管理器是我有一个需要使用的背景图像,并且使用布局管理器,图像只是被放入其中一个插槽,而不是把所有东西都放在上面。但这很可能是由于我对 PyQt 的了解有限!
import sys
from PyQt4 import QtCore, QtGui
class Ui_Form(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.setupUi(self)
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(591, 591)
self.Background = QtGui.QLabel(Form)
self.Background.setGeometry(QtCore.QRect(0, 0, 631, 591))
self.Background.setText("")
self.Background.setPixmap(QtGui.QPixmap("Python/LP_Proj/LP_Background.png"))
self.Background.setObjectName("Background")
self.btn_a1 = Button(Form)
self.btn_a2 = QtGui.QPushButton(Form)
self.btn_a2.setGeometry(QtCore.QRect(90, 40, 41, 41))
self.btn_a2.setText("")
self.btn_a2.setObjectName("btn_a2")
self.lab_a1 = QtGui.QLabel(Form)
self.lab_a1.setGeometry(QtCore.QRect(20, 76, 61, 16))
font = QtGui.QFont()
font.setPointSize(10)
self.lab_a1.setFont(font)
self.lab_a1.setObjectName("lab_a1")
self.lab_a2 = QtGui.QLabel(Form)
self.lab_a2.setGeometry(QtCore.QRect(80, 76, 61, 16))
font = QtGui.QFont()
font.setPointSize(10)
self.lab_a2.setFont(font)
self.lab_a2.setObjectName("lab_a2")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
Form.setWindowTitle(QtGui.QApplication.translate("Form", "Launchpad Control", None, QtGui.QApplication.UnicodeUTF8))
self.btn_a1.clicked.connect(self.btn_a1.playSample)
self.lab_a1.setText(QtGui.QApplication.translate("Form", "<html><head/><body><p align=\"center\"><span style=\" color:#ffffff;\">Unassigned</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
self.lab_a2.setText(QtGui.QApplication.translate("Form", "<html><head/><body><p align=\"center\"><span style=\" color:#ffffff;\">Unassigned</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
class Button(QtGui.QPushButton):
def __init__(self, Form):
super(Button, self).__init__()
self.setAcceptDrops(True)
self.setGeometry(QtCore.QRect(30, 40, 41, 41))
self.setText("")
self.setObjectName("btn_a1")
def dragEnterEvent(self, event):
if event.mimeData().hasUrls():
event.acceptProposedAction()
else:
super(Button, self).dragEnterEvent(event)
def dragMoveEvent(self, event):
super(Button, self).dragMoveEvent(event)
def dropEvent(self, event):
if event.mimeData().hasUrls():
for url in event.mimeData().urls():
self.samplepath = str(url.toLocalFile())
print self.samplepath
event.acceptProposedAction()
else:
super(Button,self).dropEvent(event)
def playSample(self):
sample = self.samplepath
print sample
if __name__=='__main__':
app = QtGui.QApplication(sys.argv)
ex = Ui_Form()
ex.show()
sys.exit(app.exec_())
按钮“a1”应创建在“a2”左侧和标签“a1”上方。下面是正在运行的程序和按钮应该在哪里的小屏幕截图。总共有 80 个按钮 + 标签,都具有这种拖放功能,因此我更喜欢/需要使用一个类。该类最终将确定按钮的位置和图像,但现在我只是想让它工作!
【问题讨论】:
-
您在上面的行中定义
self.button1;你没有在任何地方定义button1。它们不是一回事——一个是存在的实例属性,另一个是不存在的全局变量。 -
Totem 刚刚指出:这是我在尝试修复问题时出现的错误。如果我有 .connect(self.button1.playSample) 程序运行但似乎完全忽略了类的实例化?
-
类正在实例化;怎么可能不是?您期望发生的事情不是?
-
将按钮添加到布局的代码在哪里?
-
您能否提供一个简单的示例(我们可以运行的东西),其中有 2 个可以工作的按钮(由
setupUi创建)和一个不能工作的按钮。很难理解你目前在做什么。