Question

I'm trying to add File - Save dialog in QMainWindow, but this requires to call self.tablet[0] from QWidget. The code is below:

from PyQt4.QtGui import *
from PyQt4.QtCore import *
import csv

header1 = ['N', 'Type', 'V', 'Pg', 'Pn', 'Qn']
header2 = ['Nn', 'Nn', 'R', 'X']

class MyTable(QTableWidget):
    def __init__(self, header, *args):
        QTableWidget.__init__(self, *args)
        self.header = header
        self.setHorizontalHeaderLabels(header)
        self.setColumnWidth(0, 39)
        self.setColumnWidth(1, 40)
        self.resizeRowsToContents()
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)

class MyMainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MyMainWindow, self).__init__(parent)
        self.form_widget = MainWidget(self)
        _widget = QWidget()
        _layout = QVBoxLayout(_widget)
        _layout.addWidget(self.form_widget)
        self.setCentralWidget(_widget)

        #menu
        menubar = self.menuBar()
        file = menubar.addMenu('&File')

        exit = QAction('Exit', self)
        exit.setShortcut('Ctrl+Q')
        self.connect(exit, SIGNAL('triggered()'), SLOT('close()'))

        save = QAction('Save', self)
        save.setShortcut('Ctrl+S')
        self.connect(save, SIGNAL('triggered()'), self.Save)

        file.addAction(save)
        file.addAction(exit)

    def Save(self):
        self.rowdata = []
        path = QFileDialog.getSaveFileName(self, 'Save File', '', 'CSV(*.csv)')
        if path:
            with open(path, 'w', newline='') as stream:
                writer = csv.writer(stream, delimiter=';')
                for row in range(MainWidget().table[0].rowCount()):
                    for column in range(self.table[0].columnCount()):
                        item = self.table[0].item(row, column)
                        if item is not None and item.text() != '':
                            self.rowdata.append(float(item.text()))
                        else:
                            self.rowdata.append(0)
                    writer.writerow(self.rowdata)
                    self.rowdata = []

class MainWidget(QWidget):
    def __init__(self, parent):
        QWidget.__init__(self)

        self.setGeometry(250, 150, 400, 300)
        self.setWindowTitle("New")

        self.tab_widget = QTabWidget()
        self.tab1 = QWidget()
        self.tab2 = QWidget()

        self.tab_widget.addTab(self.tab1, "Uzli")
        self.tab_widget.addTab(self.tab2, "Vetvi")

        #Uzli on tab1 
        self.table = {}
        self.table[0] = MyTable(header1, 1, 6, self.tab1)
        self.table[0].resize(525, 430)
        self.table[0].show()

        #Vetvi on tab2 
        self.table[1] = MyTable(header2, 1, 4, self.tab2)
        self.table[1].resize(525, 430)
        self.table[1].show()

        #layers
        self.vbox = QVBoxLayout()
        self.vbox.addWidget(self.tab_widget)
        self.setLayout(self.vbox)

        self.tab1_layout = QGridLayout()
        self.tab1.setLayout(self.tab1_layout)
        self.tab1_layout.addWidget(self.table[0], 1, 0, 5, 1)

        self.tab2_layout = QGridLayout()
        self.tab2.setLayout(self.tab2_layout)
        self.tab2_layout.addWidget(self.table[1], 1, 0, 5, 1)

if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    widget = MyMainWindow()
    widget.resize(640, 480)
    widget.show()
    sys.exit(app.exec_())

When i try to use "File - save" dialog in this application:

    for row in range(MainWidget().table[0].rowCount()): 
TypeError: __init__() missing 1 required positional argument: 'parent'

please, help me find a mistake.

Was it helpful?

Solution

MainWidget() trys to create another instance of MainWidget, apprantly __init__(self, parent) needs another argument parent. Use the original one you've created self.form_widget.table[0]...

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top