2016-11-08 85 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__时有错误的参数。
目前尚不清楚为什么您添加self作为第一个参数。 Python提供了隐含的self,所以它的data必须先行。
如果您打算为MyTable的提供父窗口就必须走过去, 看到签名QTableWidget::QTableWidget (int rows, int columns, QWidget * parent = 0)
所以调用将厕所这样的:

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

MyTable默认情况下将emdedded为Window显然,这是不是你想要的。 为了避免嵌入要么省略parent参数和参考

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

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

谢谢你,它工作得很好,但在第二个方式与“Qt.window”我不明白为什么它的工作... – Dadep

+0

@Dadep这就像QDialog的,它设置了该标志。所有未嵌入的qt窗口都有这个标志。因此,做一个小部件框架窗口,关闭按钮这个标志添加到窗口标志。参见[QT DOC](http://doc.qt.io/qt-4.8/qt.html#WindowType-enum)。 – robyschek