【问题标题】:Displaying custom button class in PyQt4在 PyQt4 中显示自定义按钮类
【发布时间】: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 创建)和一个不能工作的按钮。很难理解你目前在做什么。

标签: python qt pyqt qt4 pyqt4


【解决方案1】:

Python 不会忽略 Button 类的实例化。 PyQt 也不是。该按钮肯定正在创建中。

关键是在创建过程中,您无法看到它。这是因为您必须将其添加到作为 Ui_Form 子级的布局中,或者显式指定按钮的父小部件(无论如何,前者实际上在内部执行后者)。

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

【讨论】:

  • 由于无法在此处正确格式化,我将把当前在 setupUi 函数中添加按钮的方式添加到我的问题中。我真的不明白如何做你为我的按钮所说的任何事情,但是,如果我很愚蠢,对不起,它非常简单!
  • 好的,我现在了解手头的问题,但是我不知道如何将按钮添加到我现有的布局中。我不使用布局管理器,按照问题底部所述的方式创建了 80 个按钮。它们根本不会添加到布局管理器中,那么如何显示我以这种方式创建的按钮?
  • 使用作为父表单的表单创建它就足够了,只需将其移动()到您想要的位置并显示()它。但是使用布局管理器...
  • 我不太确定如何为我的目的使用布局管理器,因为:我有一个背景图像,所以如果我使用布局管理器构建整个事物,图像将被设置为经理内部的“障碍”而不是背景?如果这是有道理的。例如,我的背景将在左上角,按钮将是下一个正方形,依此类推
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多