在 PyQt4 中显示自定义按钮 class

Displaying custom button class in PyQt4

我创建了一个自定义按钮 class,我希望将其添加到使用 QT Designer 创建的布局中。

这是第一个 class' 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:

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 创建的按钮的方式显示此按钮 class。

按钮目前通过以下方式添加到 Ui_Form class 的 setupUi 函数中(它们没有添加到布局管理器,所以我假设 'form' 有一些东西处理它,但我只是不知道该做什么!):

    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 个按钮 + 标签,都具有拖放功能,因此我 prefer/need 使用 class。 class 最终会确定按钮的位置和图像,但现在我只是想让它正常工作!

Python 并没有忽略 Button class 的实例化。 PyQt 也不是。肯定正在创建按钮。

关键是在创建时,您看不到它。这是因为您必须将它添加到作为您的 Ui_Form 子级的布局中,或者明确指定按钮的父级小部件(前者实际上在内部执行后者)。

我建议将它添加到您的 Ui_Form 中的布局中,以便它在调整 window 等大小时表现良好。查看 setupUi() 方法以了解如何那里的按钮被添加到布局中。然后为您的自定义按钮复制它。