2015-04-22 45 views
-1

我創建了一個自定義按鈕類,我希望將其添加到使用QT Designer創建的佈局中。在PyQt4中顯示自定義按鈕類

這裏是一流的初始化功能:

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函數中,它們以下面的方式添加到佈局管理器中,所以我假設'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個按鈕+標籤,都具有這種拖放功能,因此我更喜歡/需要使用一個類。該課程最終將確定該按鈕的位置和圖像,但現在我只是試圖讓它工作!

Example of button

+0

您可以在上面的行中定義'self.button1';你不要在任何地方定義'button1'。它們不是一回事 - 一個是存在的實例屬性,另一個是全局變量。 – abarnert

+0

圖騰剛剛指出:這是一個錯誤,而我正在試圖解決問題。如果我有.connect(self.button1.playSample)程序運行,但似乎完全忽略了類的實例化? –

+1

該類正在實例化;它怎麼能*不是*你期望發生的事情不是什麼? – kindall

回答

1

Python是不是忽視Button類的實例。 PyQt也不是。該按鈕肯定正在創建。

關鍵是,雖然它正在創建,你不能看到它。這是因爲您必須將其添加到您的Ui_Form的子版面中,或者明確指定該按鈕的父窗口小部件(前者實際上是在內部對其進行內部處理)。

我建議將它添加到您的Ui_Form中的佈局中,以便在調整窗口大小時表現很好。請查看setupUi()方法,瞭解如何將按鈕添加到佈局。然後複製這個你的自定義按鈕。

+0

我會說按鈕在setupUi功能目前加入到我的問題的方式添加,由於不能夠到在這裏正確格式化它。 我真的不明白如何做你說我的按鈕的任何事情,但是,對不起,如果我是愚蠢的,它非常簡單! –

+0

好的,我明白現在的問題,但是我不知道如何將按鈕添加到我現有的佈局。我不使用佈局管理器,有80個按鈕都是按照問題底部所述的方式創建的。他們從來沒有添加到佈局管理器中,所以我如何顯示我以這種方式創建的按鈕? –

+0

使用父窗體創建它應該足夠,那麼只需將它移動到您想要的位置並顯示()它即可。但使用佈局管理器... –

相關問題