Topic: Qscintilla e QtabWidget  (Letto 946 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline 70qwerty70

  • python unicellularis
  • *
  • Post: 9
  • Punti reputazione: 0
    • Mostra profilo
Qscintilla e QtabWidget
« il: Novembre 27, 2012, 22:06 »
ciao a tutti
ho un problema con il seguente codice

[codice]from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.Qsci import *
import sys

class myEditor(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.tab=QTabWidget()

        self.new_file()
        self.menubar()

    def new_file(self):
        self.tab.setMovable(True)
        self.tab.setTabsClosable(True)       
        widget=QWidget()

        self.tab.addTab(widget,"Untitled")
        self.editor=QsciScintilla()
        self.setCentralWidget(self.tab)
        layout=QVBoxLayout()
        widget.setLayout(layout)
        layout.addWidget(self.editor)
       

    def menubar(self):
        menu=self.menuBar()
        f=menu.addMenu("file")

        new=QAction("New",self)
        undo=QAction("Undo",self)
        redo=QAction("Redo",self)

        self.connect(new,SIGNAL('triggered()'),self.new_file)
        self.connect(undo,SIGNAL('triggered()'),self.editor.undo)
        self.connect(redo,SIGNAL('triggered()'),self.editor.redo)

        f.addAction(new)
        f.addAction(undo)
        f.addAction(redo)

app=QApplication(sys.argv)
x=myEditor()
x.show()
app.exec_()

[/codice]

il problema è che quando creo una seconda tab i pulsanti undo e redo non funzionano sulla seconda tab ma solo sulla prima.
Mi potete aiutare?

Offline Bakuriu

  • python sapiens sapiens
  • ******
  • Post: 2.267
  • Punti reputazione: 2
  • Katon, Goukakyuu no jutsu!
    • Mostra profilo
    • Jack's Blackboard - Il mio blog
Re: Qscintilla e QtabWidget
« Risposta #1 il: Novembre 28, 2012, 23:57 »
Da quello che vedo tu crei il menu solamente quando la finestra viene creata, non quando crei un nuovo file, e quindi le azioni sono legate solamente al primo editor.
Ogni volta che crei un nuovo editor dovresti ricollegare undo e redo.

Secondo me ti conviene collegare redo/undo ad un metodo della MainWindow. In questo metodo vai a pescarti qual è l'editor attivo al momento e chiami undo/redo di quel metodo.
Tra parentesi, trovo brutto come tu setti il QsciScintilla. Ti stai complicando la vita per riuscire a recuperarlo.
A mio avviso ti conviene crearti una classe "ScintillaTab" del tipo:

[codice]
class ScintillaTab(QtGui.QWidget):
    def __init__(self, editor, parent=None):
        super(ScintillaTab, self).__init__(parent)
        self.editor = editor
        layout = QtGui.QHBoxLayout()
        layout.addWidget(self.editor)
        self.setLayout(layout)
[/codice]

Dopodichè potresti fare:

[codice]
redo.triggered.connect((lambda: self.tab.currentWidget().editor.redo()))
[/codice]
E sei a posto.

(Ho usato la "nuova"[anche se ormai esiste da anni] sintassi per connettere il segnale. Te la consiglio, sia per questione di stile, ma anche perchè è più robusta.
Usando la sintassi vecchia è possibile che alcuni errori vengano ignorati completamente e ti potresti ritrovare con bug strani.)

Offline 70qwerty70

  • python unicellularis
  • *
  • Post: 9
  • Punti reputazione: 0
    • Mostra profilo
Re: Qscintilla e QtabWidget
« Risposta #2 il: Novembre 30, 2012, 14:54 »
grazie mille  :)
ora funziona