views:

152

answers:

1

Hello there,

I'm in the process of learning how to display data and tables using PyQt. Ultimately I'd like to have a Table showing the contents of a database, but for now I'm just getting to grips with some of the fundamentals. I have a basic setup (pasted below) made using Qt Designer with a set of buttons ("Create", "Add Row", "Add Column", and "Clear"). "Create" makes a dummy table with pretend data. All of the buttons work apart from the "Clear" button, and when I click it, Python crashes entirely, and I'm left with no error messages to start working out what is wrong.

My questions are: 1) What am I doing wrong? 2) What can I do in the form of exception handling to prevent this, so I can see what's gone wrong in the future ?

import sys
from sqlite3 import *
from PyQt4 import QtCore, QtGui, QtSql
from PyQt4.QtCore import *
from PyQt4.QtGui import *

from test_class import Ui_MainWindow

class StartQT4(QtGui.QMainWindow, QTableWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        QtCore.QObject.connect(self.ui.createbutton,QtCore.SIGNAL("clicked()"),self.file_dialog)
QtCore.QObject.connect(self.ui.addrowbutton,QtCore.SIGNAL("clicked()"),self.add_row)
QtCore.QObject.connect(self.ui.addcollumnbutton,QtCore.SIGNAL("clicked()"),self.add_column)
QtCore.QObject.connect(self.ui.clearbutton,QtCore.SIGNAL("clicked()"),self.clear_table)

def add_row(self):
    self.ui.tableWidget.insertRow (0)       

def add_column(self):
    self.ui.tableWidget.insertColumn (0)

def clear_table(self):
    #This bit that won't seem to work in any combination!
    #self.ui.tableWidget.clearContents()
    self.ui.tableWidget.clear()
    #self.ui.tableWidget.setColumnCount(0)
    #self.ui.tableWidget.setRowCount(0)

def file_dialog(self):
    self.ui.textEdit.setText("Testing testing")
    self.ui.tableWidget.setColumnCount(3)
    self.ui.tableWidget.setRowCount(3)
    a = QTableWidgetItem("A")
    self.ui.tableWidget.setHorizontalHeaderItem (0, a)
    a = QTableWidgetItem("B")
    self.ui.tableWidget.setHorizontalHeaderItem (1, a)
    self.ui.tableWidget.setHorizontalHeaderItem (2, a)
    b = QTableWidgetItem("Test")
    self.ui.tableWidget.setItem(1,1,b)       

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = StartQT4()
    myapp.show()
    sys.exit(app.exec_())
A: 

It "crashes entirely"? Without stack trace and everything? Hard to believe...

Anyway, the PyQt4 documentation knows neither QTableView.clear nor QTableView.clearContents, but it knows QTableView.clearSpans which is supposed to do what you want.

delnan
Argh, I realised I'm using a tableWidget, not a tableView, my mistake! For the moment I've been working on tableWidget as I can't seem to find any working examples online of tableViews that actually run at all.The weird behaviour I am experiencing is that windows simply says "python.exe has stopped working" and forces the program to quit. Is there anything else I could try to get it working with a tableWidget?
belometer
Actually, I have sorted it out with a QSql model, which was what I was after in the end anyway. Thanks for the help though, you pointed me in the right direction to finally get it sorted out!
belometer
Still weird... QTableWidget knows both `clear` and `clearContents` (the latter leaves the headers in place). But glad to hear something else works.
delnan