如何在保持菜单栏的情况下将表格添加到PyQt5的中央小部件中?

时间:2018-08-27 15:00:22

标签: python pyqt5

我在创建PyQt5 GUI时遇到了麻烦,在这里我需要一个信息表作为中央小部件和菜单栏(最终将在其中放入排序选项)。我的代码允许我拥有表格或菜单,但不能同时拥有两者,并且由于未定义类,因此无法设置中央小部件。希望这只是我所缺少的小东西。谢谢您的帮助。

这是我的代码:

class Main(QMainWindow):

def __init__(self,parent = None):
    super().__init__()
    #self.grid_widget = App(grid)
    self.initUI()

def initUI(self):    


    exitAct = QAction(QIcon('exit.png'), '&Exit', self)        
    exitAct.setShortcut('Ctrl+Q')
    exitAct.setStatusTip('Exit application')
    exitAct.triggered.connect(qApp.quit)

    self.statusBar()

    menubar = self.menuBar()
    fileMenu = menubar.addMenu('&File')
    fileMenu.addAction(exitAct)

    #self.setCentralWidget(self.grid_widget)

    self.show()



if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Main()
    sys.exit(app.exec_())



class App(QWidget):

def __init__(self, parent = None):
    super(App, self).__init__(parent)
    self.title = 'PyQt5 table'
    self.left = 90
    self.top = 90
    self.width = 800
    self.height = 600
    self.initUI()

def initUI(self):
    self.setWindowTitle(self.title)
    self.setGeometry(self.left, self.top, self.width, self.height)

    self.createTable()

    # Add layout, add table to grid layout
    grid = QGridLayout()

    grid.addWidget(self.tableWidget)

    self.setLayout(grid) 

    # Show widget
    self.show()

def createTable(self):
   # Create table
    self.tableWidget = QTableWidget()
    self.tableWidget.setRowCount(len(q1.index))
    self.tableWidget.setColumnCount(len(q1.columns))
    self.tableWidget.setHorizontalHeaderLabels(heads) #set column names to headers in df
    for i in range(len(q1.index)):
        for j in range(len(q1.columns)):
            self.tableWidget.setItem(i, j, QTableWidgetItem(str(q1.iat[i, j])))

    self.tableWidget.resizeColumnsToContents()
    self.tableWidget.resizeRowsToContents()
    self.tableWidget.move(0,0)

    # table selection change
    self.tableWidget.doubleClicked.connect(self.on_click)


@pyqtSlot()
def on_click(self):
    print("\n")
    for currentQTableWidgetItem in self.tableWidget.selectedItems():
        print(currentQTableWidgetItem.row(), currentQTableWidgetItem.column(), currentQTableWidgetItem.text())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

哪个产生这个:

enter image description here

,并且完全忽略了我的整个tablewidget。

我已在QMainWindow中注释了第三行,因为它会产生一个错误,指出未定义App。

如何设置中央窗口小部件,使其也可以显示表格?谢谢。

1 个答案:

答案 0 :(得分:0)

应用程序应该只有一个主程序,要执行的只有第一个,因此不会定义您所需要的所有内容,因此未按您的指示定义App。

因此解决方案是消除中间主电源并将其复制到最终主电源。

class Main(QMainWindow):
    def __init__(self,parent = None):
        super().__init__()
        self.grid_widget = App(self)
        self.initUI()
...

class App(QWidget):
    ...

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Main()
    sys.exit(app.exec_())