PyQt用table打开子窗口(图灵机App)

Posted

技术标签:

【中文标题】PyQt用table打开子窗口(图灵机App)【英文标题】:PyQt open a subwindow with table (turing machine App) 【发布时间】:2016-11-08 16:06:07 【问题描述】:

我想创建一个带有按钮"ruban" 的窗口,当我单击此按钮时,它会打开一个新窗口,其中包含一个包含"data" 的表格。 我的问题是当我运行它时,我点击它没有出现任何东西的按钮......

非常感谢您的帮助!

#!/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()

【问题讨论】:

【参考方案1】:

你在调用MyTable.__init__时有错误的参数。 不清楚为什么要添加 self 作为第一个参数。 Python 提供了隐式的self,所以必须先使用data。 如果您打算为 MyTable 提供父窗口,它必须放在最后, 见签名QTableWidget::QTableWidget ( int rows, int columns, QWidget * parent = 0 ), 所以电话会像这样:

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

MyTable 默认会嵌入到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()

【讨论】:

非常感谢,它工作正常,但在第二种方式中使用 'Qt.window' 我不明白为什么它工作...... @Dadep 就像 QDialog,它设置了这个标志。所有非嵌入式 qt 窗口都有这个标志。因此,要使小部件成为带框架的窗口,关闭按钮将此标志添加到窗口标志。见qt doc。

以上是关于PyQt用table打开子窗口(图灵机App)的主要内容,如果未能解决你的问题,请参考以下文章

在 PyQt 的子窗口中从父窗口访问数据

pyqt5实现打开子窗口

pyqt5实现打开子窗口

PyQt5从子窗口关闭父窗口和子窗口

pyqt中QMdiArea子窗口关闭的问题

从 PyQt 的主窗口打开 Ui_Form