2017-09-01 69 views
1

我正在學習Qt以及如何使用python創建GUI。 我設法創建我自己的Qt文件,並用按鈕和其他簡單的東西填充它,但現在我發現this amazing attitude indicator包括我的Qt GUI中的外部部件[python]

這個ai.py文件包含一個態度小部件,我想在我自己的GUI中導入。所以我設計與名爲空部件的.ui文件「viz_widget」,然後我寫了這條巨蟒文件

# -*- coding: utf-8 -*- 

import sys 
from PyQt4 import QtCore, QtGui, uic 
from ai import AttitudeIndicator 

qtCreatorFile1 = "mainwindow.ui" # Enter file here. 


Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile1) 


class OperatorGUI(QtGui.QMainWindow, Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(OperatorGUI, self).__init__(parent) 
     QtGui.QMainWindow.__init__(self) 
     Ui_MainWindow.__init__(self) 
     self.setupUi(self) 
     self.viz_widget = AttitudeIndicator() 
     self.viz_widget.setPitch(10) 
     self.viz_widget.setRoll(20) 
     self.viz_widget.setHover(500/10.) 
     self.viz_widget.setBaro(500/10.) 
     self.viz_widget.update() 

    # Key press functions 
    def keyPressEvent(self, event): 
     if event.key() == QtCore.Qt.Key_Q: #Q: close the window 
      print "pressed Q: exit by keyboard" 
      self.close() 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    window = OperatorGUI() 
    window.show() 
    sys.exit(app.exec_()) 

的GUI啓動,沒有任何錯誤,但我不能顯示的態度工具到我的GUI。是否有可能導入小部件?我的錯誤是什麼?

預先感謝您

編輯:這是文件maiwindow.ui

<?xml version="1.0" encoding="UTF-8"?> 
<ui version="4.0"> 
<class>MainWindow</class> 
<widget class="QMainWindow" name="MainWindow"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>800</width> 
    <height>600</height> 
    </rect> 
    </property> 
    <property name="windowTitle"> 
    <string>MainWindow</string> 
    </property> 
    <widget class="QWidget" name="centralWidget"> 
    <widget class="QWidget" name="viz_widget" native="true"> 
    <property name="geometry"> 
    <rect> 
     <x>50</x> 
     <y>40</y> 
     <width>671</width> 
     <height>441</height> 
    </rect> 
    </property> 
    </widget> 
    </widget> 
    <widget class="QMenuBar" name="menuBar"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>800</width> 
    <height>20</height> 
    </rect> 
    </property> 
    </widget> 
    <widget class="QToolBar" name="mainToolBar"> 
    <attribute name="toolBarArea"> 
    <enum>TopToolBarArea</enum> 
    </attribute> 
    <attribute name="toolBarBreak"> 
    <bool>false</bool> 
    </attribute> 
    </widget> 
    <widget class="QStatusBar" name="statusBar"/> 
</widget> 
<layoutdefault spacing="6" margin="11"/> 
<resources/> 
<connections/> 
</ui> 
+0

您可能只需將窗口小部件添加到窗口的佈局 - 或者說,它的中心窗口部件的佈局。 – ekhumoro

+0

@ekhumoro我在QtCreator中的窗口(ui.file)中添加了一個名爲viz_widget的小部件。然後,我將它連接到self.viz_widget = AttitudeIndicator()'行的對象AttitudeIndicator。我需要做更多或不同的事情嗎? – marcoresk

+0

首先:擺脫這兩個'__init__'調用 - 如果您使用'super',則不需要它們。其次,刪除你在QtCreator中添加的小部件,所以你只需要一個空的主窗口(並保存更改)。然後將此行添加到'__init__'的末尾:'layout = QtGui.QVBoxLayout(self.centralWidget())'。最後,將小部件添加到佈局:'layout.addWidget(self.viz_widget)'。 – ekhumoro

回答

1

下面是兩個代碼添加AttitudeIndicator部件所需的步驟,並通過推廣Qt設計。

首先,您需要對「mainwindow.ui」文件進行一些更改。因此,在Qt設計器中,單擊Object Inspector中的中央窗口小部件,然後在Property Editor中將objectName更改爲central_widget。這很重要,因爲當前的名字是我們稍後需要使用的QMainWindow.centralWidget()方法的陰影。其次,在中央小部件仍處於選中狀態的情況下,單擊工具欄上的水平放置(該圖標有三個藍色垂直條) - 並保存更改。

現在右鍵單擊viz_widget(無論是在Object Inspector或形式),選擇推進到...,並在頭文件進入促進類名MyAttitudeIndicatorai_widget。然後點擊添加升級 - 並保存更改。完成之後,您應該在Object Inspector中看到QWidget更改爲MyAttitudeIndicator。 (但是請注意,形式爲的實際小部件不會顯示爲AttitudeIndicator。爲此,您需要編寫一個custom designer plugin,這超出了本問題的範圍)。

要利用這些更改,需要添加一些代碼。首先,您需要爲提升的窗口小部件類創建一個名爲ai_widget.py的模塊。該模塊應該包含這樣的代碼:

from ai import AttitudeIndicator 

class MyAttitudeIndicator(AttitudeIndicator): 
    def __init__(self, parent, hz=30): 
     super(MyAttitudeIndicator, self).__init__(hz=hz) 
     self.setParent(parent) 

的最主要的原因,這個類需要的是因爲原來AttitudeIndicator具有越野車的API。構造函數確實需要一個父窗口部件(在上面的代碼中已經修復)。但是,您也可以使用此類添加您自己的自定義功能。

最後一步是對主腳本添加一些更改,如下所示。請注意,在Qt Designer中添加的所有小部件將成爲傳遞到setupUi()的對象的屬性(即在這種情況下爲主窗口self)。

import sys 
from PyQt4 import QtCore, QtGui, uic 
from ai import AttitudeIndicator 

qtCreatorFile1 = "mainwindow.ui" # Enter file here. 

Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile1) 

class OperatorGUI(QtGui.QMainWindow, Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(OperatorGUI, self).__init__(parent) 
     self.setupUi(self) 

     # promoted widget from qt designer 
     self.viz_widget.setPitch(10) 
     self.viz_widget.setRoll(20) 
     self.viz_widget.setHover(500/10.) 
     self.viz_widget.setBaro(500/10.) 

     # optional second widget 
     self.viz_widget2 = AttitudeIndicator() 
     self.viz_widget2.setPitch(10) 
     self.viz_widget2.setRoll(-40) 
     layout = self.centralWidget().layout() 
     layout.addWidget(self.viz_widget2) 

    # Key press functions 
    def keyPressEvent(self, event): 
     if event.key() == QtCore.Qt.Key_Q: #Q: close the window 
      print "pressed Q: exit by keyboard" 
      self.close() 

if __name__ == "__main__": 

    app = QtGui.QApplication(sys.argv) 
    window = OperatorGUI() 
    window.show() 
    sys.exit(app.exec_()) 
+0

非常感謝。第二個策略奇妙地工作(也許中央小部件名稱使竅門)。推廣看起來很有趣,但它仍然不起作用,並給我這個錯誤'超級(MyAttitudeIndicator,self).__ init __(hz = hz) TypeError:__init __()有一個意外的關鍵字參數'hz''。我不知道'hz'。但是你發現至少有一個解決方案可以工作,我接受了答案,並再次感謝你的幫助。 – marcoresk

+0

@marcoresk。沒問題。我使用了[github,它有'hz'參數]中的當前「ai.py」(https://github.com/capriele/crazyflie-clients-python-move/blob/master/build/lib.linux- i686-2.7/cfclient/UI /部件/ ai.py#L45)。我的代碼已經過全面測試,所以我知道這一切正常。 – ekhumoro

+0

我發現,在沒有意識的情況下,在ai_widget中刪除hz = hz,該升級似乎可行(至少它出現在GUI中)。再次感謝你。 – marcoresk