如何在PyQt5,Python中继承QTableWidget和我的类MainWindow?

时间:2017-07-21 16:31:57

标签: python inheritance pyqt pyqt5 multiple-inheritance

首先,我对python相对较新,对PyQt来说很新。我已经迈出了面向对象编程的第一步,我一直在寻找在线教程,但我仍然坚持多重继承问题。

我有一个名为CreateTable()的类,其目的是在我的应用程序窗口中创建一个QTableWidget,当单击一行时,它会打开一个上下文菜单,然后您可以选择图形选定行的选项。图表选项连接到另一个类Plotter()。

我的问题是CreateTable需要继承PyQt的QTableWidget和我的类MainWindow,因为我需要引用布局变量才能将我的图形嵌入到我的应用程序窗口中。

我尝试继承的代码如下所示,并在此处大量借用:How does Python's super() work with multiple inheritance?

class QTable(QTableWidget):
  def __init__(self):
    super(QTable, self).__init__()
class PassMain(MainWindow):
  def __init__(self):
    super(PassMain, self).__init__()
class PassMainTable(PassMain, QTable):
  def __init__(self):
    super(PassMainTable, self).__init__()

主要问题是当我尝试将图形放在MainWindow布局中时。

self.vboxRight.addWidget(self.Graph) 

这是我创建表格和调用绘图仪的代码

class CreateTable(PassMainTable): #QTableWidget
def __init__(self, Data, row, col, colHeaders, rowHeaders): #Index, ColumnHeaders
    super(CreateTable, self).__init__()


    self.setSelectionBehavior(self.SelectRows)

    print("Start initialization")
    self.ColHeader = colHeaders
    self.setRowCount(row)
    self.setColumnCount(col)
    self.data = Data
    self.setHorizontalHeaderLabels(colHeaders)

    print("Right before for loop")

    n = len(Data)
    m = len(colHeaders)

    for i in range(n):
        DataValues = self.data.iloc[i,:]
        print("values are {}".format(DataValues))
        #m = len(values)
        ConvertedVals = pd.to_numeric(DataValues)

        ValList = DataValues.values.tolist()
        print(ValList)

        for j in range(0,m):
            self.item = QTableWidgetItem(str(round(ValList[j],5)))
            #print("{}, {}".format(i, j))
            self.setItem(i,j, self.item)

def contextMenuEvent(self, event):

    menu = QMenu(self)
    graphAction = menu.addAction("Graph")
    compareAction = menu.addAction("Compare")
    scatterAction = menu.addAction("Plot types")
    aboutAction = menu.addAction("about")
    quitAction = menu.addAction("quit")
    printAction = menu.addAction("Print Row")
    action = menu.exec_(self.mapToGlobal(event.pos()))
    if action == quitAction:
        qApp.quit()
    elif action == printAction:
        self.selected = self.selectedItems()
        n = len(self.selected)
        print("n is {}".format(n))
        for i in range(n):
            self.selected[i] = str(self.selected[i].text())
        for i in range(n):
            self.selected[i] = float(self.selected[i])
        print(self.selected)
    elif action == graphAction:
        self.selected = self.selectedItems()
        n = len(self.selected)
        for i in range(n):
            self.selected[i] = str(self.selected[i].text())
        for i in range(n):
            self.selected[i] = float(self.selected[i])
        print("right before plotter called")

        self.Graph = Plotter(self.selected, self.ColHeader)

        self.vboxRight.addWidget(self.Graph)
    else:
        print("u clicked something other than quit")

更糟糕的是,PyQt将我的所有错误都视为异常,因此我得到的所有错误都是"进程完成了退出代码1"

如果您需要进一步参考我的完整代码,我在此处提供了一个链接:https://github.com/Silvuurleaf/Data-Analysis-and-Visualization-GUI/blob/master/Plotter3.1.py

谢谢,我感谢任何帮助,所有人都可以给我。

1 个答案:

答案 0 :(得分:1)

为了共享数据,没有必要继承小部件,只需使用信号,这是PyQt以异步方式共享数据的自然方式。在您的示例中,我们将创建一个名为dataSignal的信号,根据您希望使用变量self.selectedself.ColHeader的代码所观察到的,第一个类型为{ {1}}和第二个list以及我们将构建信号:

numpy.ndarray

然后在MainWindow类中创建一个插槽,在此创建Plotter对象并将其添加到布局中。

class CreateTable(QTableWidget): #QTableWidget
    dataSignal = pyqtSignal(list, np.ndarray)
    def __init__(self, Data, row, col, colHeaders, rowHeaders): #Index, ColumnHeaders
        super(CreateTable, self).__init__()


        self.setSelectionBehavior(self.SelectRows)

        print("Start initialization")
        self.ColHeader = colHeaders
        self.setRowCount(row)
        self.setColumnCount(col)
        self.data = Data
        self.setHorizontalHeaderLabels(colHeaders)

        print("Right before for loop")

        n = len(Data)
        m = len(colHeaders)

        for i in range(n):
            DataValues = self.data.iloc[i,:]
            print("values are {}".format(DataValues))
            #m = len(values)
            ConvertedVals = pd.to_numeric(DataValues)

            ValList = DataValues.values.tolist()
            print(ValList)

            for j in range(0,m):
                self.item = QTableWidgetItem(str(round(ValList[j],5)))
                #print("{}, {}".format(i, j))
                self.setItem(i,j, self.item)

    def contextMenuEvent(self, event):

        menu = QMenu(self)
        graphAction = menu.addAction("Graph")
        compareAction = menu.addAction("Compare")
        scatterAction = menu.addAction("Plot types")
        aboutAction = menu.addAction("about")
        quitAction = menu.addAction("quit")
        printAction = menu.addAction("Print Row")
        action = menu.exec_(self.mapToGlobal(event.pos()))
        if action == quitAction:
            qApp.quit()
        elif action == printAction:
            self.selected = self.selectedItems()
            n = len(self.selected)
            print("n is {}".format(n))
            for i in range(n):
                self.selected[i] = str(self.selected[i].text())
            for i in range(n):
                self.selected[i] = float(self.selected[i])
            print(self.selected)
        elif action == graphAction:
            self.selected = self.selectedItems()
            n = len(self.selected)
            for i in range(n):
                self.selected[i] = str(self.selected[i].text())
            for i in range(n):
                self.selected[i] = float(self.selected[i])
            print("right before plotter called")

            print(type(self.selected), type(self.ColHeader))
            self.dataSignal.emit(self.selected, self.ColHeader)

        else:
            print("u clicked something other than quit")

为此,我们在创建def dataPlotter(self, x_data,y_data): self.Graph = Plotter(x_data, y_data) self.vboxRightBottom.addWidget(self.Graph) 对象时连接信号:

CreateTable

完整代码为here