PDA

View Full Version : [Python] Problema con pyqt4


shainer_dev
29-08-2009, 15:00
Salve a tutti,

sto iniziando da poco ad imparare come usare le QT con il linguaggio python. Premetto che non ho mai usato le QT in altri contesti e sono poco esperta nell'uso di classi in generale.
Il problema nel mio codice è questo: se inserisco una Menubar, poi non riesco ad inserire più di un widget (impostato come central widget con setCentralWidget). Se provo ad esempio ad inserire un'hbox o una griglia con due pulsanti, essi non vengono visualizzati.

Ho provato a spostare la creazione del menu in una classe apposita, facendo avvenire la creazione nel suo __init__, ma non è servito. Al momento l'ho spostata in una funzione che si trova all'interno della stessa classe degli altri widget, col risultato che viene visualizzato il solo menu.

Ecco il codice interessato:

class MainWindow(QtGui.QMainWindow, QtGui.QWidget):

def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
QtGui.QWidget.__init__(self, parent)

self.resize(700, 600)

self.hbox = QtGui.QHBoxLayout()
self.CreateMenus()

self.button = QtGui.QPushButton('prova')
self.button2 = QtGui.QPushButton('prova2')
self.hbox.addWidget(self.button)
self.hbox.addWidget(self.button2)
self.setLayout(self.hbox)

def CreateMenus(self):
self.quit = QtGui.QAction(QtGui.QIcon('icons/info.png'), 'Quit', self)
self.quit.setShortcut('Ctrl+Q')
self.connect(self.quit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()'))

self.pref = QtGui.QAction(QtGui.QIcon('icons/info.png'), 'Preferences', self)
self.pref.setShortcut('Ctrl+P')

self.info = QtGui.QAction(QtGui.QIcon('icons/info.png'), 'Information', self)
self.info.setShortcut('Ctrl+I')

self.statusBar()

self.menubar = self.menuBar()
self.file = self.menubar.addMenu('&File')
self.mod = self.menubar.addMenu('&Edit')
self.about = self.menubar.addMenu('&About')
self.file.addAction(self.quit)
self.mod.addAction(self.pref)
self.about.addAction(self.info)


app = QtGui.QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())


Dove sbaglio?
Un ringraziamento a chi mi risponderà,
Lisa

nico159
29-08-2009, 19:21
Stai sbagliando un pò di cose, il codice esatto è:
from PyQt4 import QtCore, QtGui
import sys

class MainWindow(QtGui.QMainWindow):

def __init__(self):
QtGui.QMainWindow.__init__(self)

self.resize(700, 600)

self.createCentralWidget()
self.createMenus()

def createCentralWidget(self):
self.widget = QtGui.QWidget(self)
self.hbox = QtGui.QHBoxLayout()
self.button = QtGui.QPushButton('prova', self.widget)
self.button2 = QtGui.QPushButton('prova2', self.widget)
self.hbox.addWidget(self.button)
self.hbox.addWidget(self.button2)
self.widget.setLayout(self.hbox)

self.setCentralWidget(self.widget)

def createMenus(self):
self.quit = QtGui.QAction(QtGui.QIcon('icons/info.png'), 'Quit', self)
self.quit.setShortcut('Ctrl+Q')
self.connect(self.quit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()'))

self.pref = QtGui.QAction(QtGui.QIcon('icons/info.png'), 'Preferences', self)
self.pref.setShortcut('Ctrl+P')

self.info = QtGui.QAction(QtGui.QIcon('icons/info.png'), 'Information', self)
self.info.setShortcut('Ctrl+I')

self.statusBar().show()

self.menubar = self.menuBar()
self.file = self.menubar.addMenu('&File')
self.mod = self.menubar.addMenu('&Edit')
self.about = self.menubar.addMenu('&About')
self.file.addAction(self.quit)
self.mod.addAction(self.pref)
self.about.addAction(self.info)


app = QtGui.QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())

Non c'è bisogno di derivare QWidget

Sbagli argomenti da passare a QMainWindow:
http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qmainwindow.html#QMainWindow
Il parent glielo passi già con self

Stai cercando di dare un layout a QMainWindow, ma QMainWindow ha già il suo layout:
http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qmainwindow.html#details
Devi prima creare un widget, impostarne il layout, inserire nel layout i vari elementi e poi impostarlo come central widget

Quando crei un nuovo widget (qualsiasi) devi sempre dire a chi appartiene:
self.widget = QtGui.QWidget(self)
Ha self perchè appartiene a QMainWindow,
self.button = QtGui.QPushButton('prova', self.widget)
self.button2 = QtGui.QPushButton('prova2', self.widget)
Hanno self.widget perchè appartengono a self.widget

Questi gli errori, i consigli:
Inizia con la maiuscola solo le classi, mai i metodi
Usa self solo quando serve, per una questione di prestazioni
Usa sempre nomi esplicativi

Vedrai che è tutto molto facile, basta capire la documentazione:
http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html
http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/modules.html
http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/classes.html
e fare un pò di pratica.

Benvenuta in Python + QT4 ;)

shainer_dev
29-08-2009, 19:33
Grazie mille per tutte le dritte (e i link)...stavo quasi per rinunciarci! ^^ Adesso già vedo le cose un po' più chiaramente.

Lisa

ndakota
31-08-2009, 13:30
Come hai fatto per poterle usare? ho scaricato sip e qt4 e ho lanciato i configure.. ma niente. come se fa? :p

nico159
31-08-2009, 15:31
Come hai fatto per poterle usare? ho scaricato sip e qt4 e ho lanciato i configure.. ma niente. come se fa? :p
Stai su Windows? Che versione di Python usi?

ndakota
31-08-2009, 19:31
si windows. 2.6. ti ho aggiunto a msn :p

nico159
31-08-2009, 21:02
si windows. 2.6. ti ho aggiunto a msn :p

http://www.riverbankcomputing.co.uk/static/Downloads/PyQt4/PyQt-Py2.6-gpl-4.5.4-1.exe ;)

ndakota
01-09-2009, 00:47
grazie, provato il codice sopra e adesso funziona. mi darò da fare a imparare python + qt4 :p e come rdbms che consigli?

nico159
02-09-2009, 23:18
grazie, provato il codice sopra e adesso funziona. mi darò da fare a imparare python + qt4 :p e come rdbms che consigli?
Personalmente ti consiglio PostgreSQL

cdimauro
03-09-2009, 07:09
Io sono affezionato a FireBird (http://www.firebirdsql.org/). E c'è anche in versione embedded. :)