2016-11-08 3 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

Смежные вопросы