2010-08-22 8 views
3

Je suis en train d'apprendre comment afficher des données et des tableaux en utilisant PyQt. En fin de compte, j'aimerais avoir un tableau montrant le contenu d'une base de données, mais pour l'instant, je commence à comprendre certains des principes fondamentaux. J'ai une configuration de base (collée ci-dessous) faite en utilisant Qt Designer avec un ensemble de boutons ("Créer", "Ajouter une ligne", "Ajouter une colonne" et "Effacer"). "Créer" crée une table fictive avec des données de simulation. Tous les boutons fonctionnent en dehors du bouton "Effacer", et quand je clique dessus, Python se bloque complètement, et il ne me reste plus de message d'erreur pour commencer à déterminer ce qui ne va pas. Mes questions sont: 1) Qu'est-ce que je fais de mal? 2) Que puis-je faire sous forme de gestion des exceptions pour éviter cela, afin que je puisse voir ce qui ne va pas dans le futur?Effacer un TableView dans PyQt

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_()) 

Répondre

2

Il "se bloque entièrement"? Sans trace de pile et tout? Difficile à croire ...

Quoi qu'il en soit, la documentation de PyQt4 ne connaît ni QTableView.clear ni QTableView.clearContents, mais elle connaît QTableView.clearSpans qui est censée faire ce que vous voulez.

+0

Argh, j'ai réalisé que j'utilise un tableWidget, pas une tableView, mon erreur! Pour l'instant j'ai travaillé sur tableWidget car je n'arrive pas à trouver des exemples de travail en ligne sur tableViews qui fonctionnent réellement. Le comportement bizarre que je rencontre est que Windows dit simplement "python.exe a cessé de fonctionner" et force le programme à quitter. Y at-il autre chose que je pourrais essayer de faire fonctionner avec un tableWidget? – belometer

+0

En fait, je l'ai trié avec un modèle QSql, ce qui était de toute façon ce que je recherchais à la fin. Merci pour l'aide cependant, vous m'avez indiqué dans la bonne direction pour enfin le régler! – belometer

+0

Toujours bizarre ... QTableWidget connaît à la fois 'clear' et' clearContents' (ce dernier laisse les en-têtes en place). Mais heureux d'entendre quelque chose d'autre fonctionne. – delnan

0

Peut-être en retard mais:

1) Qu'est-ce que je fais mal? Une erreur peut causer le plantage, donc je ne peux pas répondre. 2) Que puis-je faire sous forme de gestion des exceptions pour éviter cela, afin que je puisse voir ce qui ne va pas dans le futur?

  • Exécutez python en mode débogage. Sous Windows, le crash propre est le comportement PyQT quand une erreur survient.

This La question devrait vous aider avec les objets QTableView.