2016-11-08 51 views
1

ボタン "ruban"でウィンドウを作成したいと思います。このボタンをクリックすると、 "データ"を含むテーブルで新しいウィンドウが開きます。 私の問題は、私がそれを実行し、何も表示されていないボタンをクリックすると.... ありがとうございました!PyQtテーブルでサブウィンドウを開きます

 #!/usr/bin/env python 
     # -*- coding: utf-8 -*- 



     import sys 
     from PyQt4 import QtCore 
     from PyQt4 import QtGui 
     from PyQt4.QtCore import * 
     from PyQt4.QtGui import * 

     data = {'col1':['1','2','3'], 'col2':['4','5','6'], 'col3':['7','8','9']} 

     class Window (QtGui.QMainWindow): 

      def __init__(self): 
       super(Window, self).__init__() 
       self.setGeometry(100, 100, 500, 300) 
       self.setWindowTitle("Machine de Turing") 
       #self.setWindowIcon(QtGui.QIcon('logo.png')) 

       self.home() 

      def home(self): 

       btn1 = QtGui.QPushButton("Ruban", self) 
       btn1.clicked.connect(self.edit_ruban) 
       btn1.resize(btn1.sizeHint()) 

       self.show() 


      def edit_ruban(self): 

       table = MyTable(self, data, 5, 3) 
       table.show() 


     class MyTable(QTableWidget): 
      def __init__(self, data, *args): 
       QTableWidget.__init__(self, *args) 
       self.data = data 
       self.setmydata() 
       self.resizeColumnsToContents() 
       self.resizeRowsToContents() 

      def setmydata(self): 

       horHeaders = [] 
       for n, key in enumerate(sorted(self.data.keys())): 
        horHeaders.append(key) 
        for m, item in enumerate(self.data[key]): 
         newitem = QTableWidgetItem(item) 
         self.setItem(m, n, newitem) 
       self.setHorizontalHeaderLabels(horHeaders) 



     def run(): 
      app = QtGui.QApplication(sys.argv) 
      GUI=Window() 
      sys.exit(app.exec_()) 

     run() 

答えて

2

MyTable.__init__の呼び出しで間違った引数があります。
最初のargとしてselfを追加する理由は明確ではありません。 Pythonは暗黙的にselfを提供していますので、先に進む必要があるのはdataです。
あなたはMyTableというの親ウィンドウを提供することを目的とした場合、それは最後に行かなければならない、 が署名QTableWidget::QTableWidget (int rows, int columns, QWidget * parent = 0)を参照してください、
ので、呼び出しは次のようにトイレになります。デフォルトで

table = MyTable(data, 5, 3, self) 

しかしMyTableWindowにemdeddedされますどうやらそれはですあなたは欲しくない。おかげで多く、それが正常に動作のいずれか埋め込まないparent引数を省略し、Qt.Window

def edit_ruban(self): 
    table = MyTable(data, 5, 3, self) 
    # add Qt.Window to table's flags 
    table.setWindowFlags(table.windowFlags() | Qt.Window) 
    table.show() 
+0

に新しく作成されたテーブルに

def edit_ruban(self): table = MyTable(data, 5, 3) # no parent provided table.show() self.table = table # this prevents the garbage collector # from deleting the new table 

またはより良いセットウィンドウフラグを参照を保存するには が、と第二の方法で'Qt.window'なぜそれが動作するのかわかりません... – Dadep

+0

@Dadep QDialogのように、このフラグが設定されています。埋め込まれていないqtウィンドウにはすべてこのフラグがあります。したがって、ウィジェットをフレーム付きのウィンドウにするには、閉じるボタンがこのフラグをウィンドウフラグに追加します。 [qt doc](http://doc.qt.io/qt-4.8/qt.html#WindowType-enum)を参照してください。 – robyschek

関連する問題