QToolBar mit mehr pepp

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo Leute,

die Standard-QToolbar ist an sich ja nicht schlecht, aber ihr kennt ja sicherlich (rein optisch) bessere Toolbars. Hier ein Beispiel:

Bild

Ich habe mich im QT-Designer umgesehen, jedoch finde ich keine Möglichkeit die Toolbar so zu gestalten. Ich vermute mal sehr stark, dass ich da selbst Hand anlegen muss. Ich vermute auch, dass ich dann (ähnlich wie beim SysemTray-Menu) zunächst ein QMenu mit sämtlichen QActions kreieren muss. Dazu dann eine QToolButton. Aber weiter komme ich auch nicht wirklich.

Hier mein vorläufiger Code, der allerdings nicht funktioniert:

Code: Alles auswählen

from PyQt4.QtGui import QMenu, QToolButton, QIcon, QAction, QToolBar

def create_toolbar_toolbutton(self):
    self.action1 = QAction(QIcon("action1.png"), "Action 1", self)
    self.action2 = QAction(QIcon("action2.png"), "Action 2", self)
    self.action3 = QAction(QIcon("action3.png"), "Action 3", self)

    self.popupMenu = QMenu()
    self.popupMenu.addAction(self.action1)
    self.popupMenu.addAction(self.action2)
    self.popupMenu.addAction(self.action3)

    self.action1.triggered.connect(self.someMethod1)
    self.action2.triggered.connect(self.someMethod2)
    self.action3.triggered.connect(self.someMethod3)

    self.toolButton = QToolButton()

    self.toolButton.setMenu(self.popupMenu)
    self.toolButton.setDefaultAction(self.action1)
    self.toolButton.setPopupMode(QToolButton.InstantPopup)

    self.toolbar = QToolBar
Was habe ich vor? also in der create_toolbar_toolbutton-Funktion erstelle ich von Zeile 4-6 die ganzen QActions. In Zeile 8-12 wird ein QMenu erzeugt, und dort werden auch die zuvor erstellten QActions untergebracht. Damit die QActions nicht nutzlos sind, werden in Zeile 13-15 die ganzen Auslöser bestimmt. Also, ab welchem Trigger was verbunden wird, und was dies dann auslösen soll. In Zeile 17 kreiere ich nun den QToolButton. Nun, in Zeile 19-21 wird das QMenu eingebunden, unc ym Ende die setPopupMode-Methode gesetzt. Un zum schluss in Zeile 23 erstelle ich eine QToolbar.

Und nun bin ich mit meinen Latein am Ende. Weißt jemand einen Rat? Womöglich ist meine Herangehensweise von vorn bis hinten falsch :-)
BlackJack

@Sophus: In Zeile 23 erstellst Du keine Toolbar, da bindest Du einfach die Klasse an ein Attribut. Selbst wenn Du da eine erstellst, wie kommt dann der Button dazu darauf zu erscheinen?
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@BlackJack: Meine Idee war / ist, das QToolButton als eine Art Widget anzusehen:

Code: Alles auswählen

import sys
from PyQt4.QtGui import QAction, QIcon, QMenu, QToolBar, QToolButton, QMainWindow, QApplication

class Dialog_01(QMainWindow):
    def __init__(self):
        super(QMainWindow, self).__init__()

        self.action1 = QAction(QIcon("action1.png"), "Action 1", self)
        self.action2 = QAction(QIcon("action2.png"), "Action 2", self)
        self.action3 = QAction(QIcon("action3.png"), "Action 3", self)

        self.popupMenu = QMenu()
        self.popupMenu.addAction(self.action1)
        self.popupMenu.addAction(self.action2)
        self.popupMenu.addAction(self.action3)

        self.action1.triggered.connect(self.someMethod1)
        self.action2.triggered.connect(self.someMethod2)
        self.action3.triggered.connect(self.someMethod3)

        self.toolButton = QToolButton()

        self.toolButton.setMenu(self.popupMenu)
        self.toolButton.setDefaultAction(self.action1)
        self.toolButton.setPopupMode(QToolButton.InstantPopup)

        self.toolba = QToolBar()
        self.toolba.addWidget(self.toolButton) # Hier
        self.addToolBar("Blah")

    def someMethod1(self):
        print "someMethod1"
    def someMethod2(self):
        print "someMethod2"
    def someMethod3(self):
        print "someMethod3"

if __name__ == '__main__':
    app = QApplication(sys.argv)
    dialog_1 = Dialog_01()
    dialog_1.show()
    sys.exit(app.exec_())
Aber auch das will nicht so ganz funktionieren.
BlackJack

@Sophus: Echt jetzt? Zeile 29? Da erwartest Du jetzt *was* genau von. m)
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

BlackJack hat geschrieben:@Sophus: Echt jetzt? Zeile 29? Da erwartest Du jetzt *was* genau von. m)
Wird in Zeile 29 die ToolBar zum Dialog_01 hinzugefügt? Ich sehe zwar die ToolBar, jedoch warst das auch schon.
BlackJack

@Sophus: Nein da wird natürlich nicht die Toolbar hinzugefügt. Dazu müsste man an der Stelle *die Toolbar* hinzufügen. Was ist den 'Blah'? Was soll das der Methode zum Hinzufügen einer Toolbar so eine sinnfreie Zeichenkette zu übergeben?
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@BlackJack: Dieses "Blah" hatte keine Bewandtnis. Ich bin auf dieses "Blah" gekommen, weil ich mir dieses Beispiel angesehen habe:

Code: Alles auswählen

    def initUI(self):               
        
        exitAction = QtGui.QAction(QtGui.QIcon('exit24.png'), 'Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.triggered.connect(self.close)
        
        self.toolbar = self.addToolBar('Exit')
        self.toolbar.addAction(exitAction)
        
        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('Toolbar')    
        self.show()
Hier (addToolBar) steht dann einfach "Exit". Ob da nun "Blah" oder "Exit" steht, sollte nun keine Rolle spielen? Zumindest in meiner Spielerei. Jedoch komme ich leider bei meinem ursprünglichen Vorhaben nicht weiter.
BlackJack

@Sophus: Was bedeutet denn diese Zeichenkette und was macht die Methode `addToolbar()` wenn man ihr eine Zeichenkette übergibt. Welche Toolbar wird denn da hinzugefügt? Du denkst ja anscheinend das ist die `self.toolba` in Deinem Code — wie denkst Du denn das der Aufruf *das* weiss? Du erwartest da irgendwo ein bisschen zu viel Magie.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@BlackJack: Mit dieser Zeichenkette wird das entsprechende Toolbar aufgerufen. Jede Toolbar hat sozusagen ihre eigene Namen. Damit nicht gleich alle Toolbars aufgerufen werden, spricht man über die Zeichenkette diese Toolbar an, die man auch haben will. Wenn die Toolbar also "Exit" heißt, übergibt man der .addToolBar() den Namen der Toolbar. So würde ich das verstehen.
BlackJack

@Sophus: Was meinst Du mit ”aufgerufen”? Und wo hast Du diese Idee her? Wenn das echt das ist was Du unter der Dokumentation verstanden hast, dann wird das schwierig mit dem Programmieren von Qt-Anwendungen.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Ich versuchs nochmal. Sollte ich diesmal wieder komplett falsch liegen, kannst du mich ja erlösen, anstatt zappeln zu lassen :-) Ich schreibe im Code die Kommenare.

Code: Alles auswählen

    def initUI(self):              
       
        exitAction = QtGui.QAction(QtGui.QIcon('exit24.png'), 'Exit', self) # QAction an das Attribut exitAction binden
        exitAction.setShortcut('Ctrl+Q') # Tastenkürzel festlegen
        exitAction.triggered.connect(self.close) # Den Trigger an eine bestimmte Methode verbinden (connect). Hier: Schließe-Methode
       
        self.toolbar = self.addToolBar('Exit') # addToolBar an das Attribut toolbar binden. Durch die Zeichenkette "Exit" wird das QAction mit eingebunden (Ich weiss mich nciht anders auszudrücken)

        self.toolbar.addAction(exitAction) # zum Attribut toolbar wie eine Aktion hinzugefügt. Hier: exitAction
       
Um die Geschichte mit der addToolBar nochmal aufzugreifen, habe ich mal ein paar Zeilen geschrieben, um zu zeigen, wie ich es verstehe, denn am oberen Beispiel ist es etwas blöd.

Code: Alles auswählen

    self.meTool = QToolBar()
    self.addToolBar(self.meTool)
Ich binde zunächste die QToolBat an das Attribut meTool und im nächsten Schritt füge ich zur Methode addToolBar nun das Attribut meTool hinzu. Denn wie der Name dieser Methode schon sagt, soll eine Toolbar hinzugefügt werden. Da die ToolBar selbst keine Methode addToolBar besitzt (Wieso denn auch? Sich selbst hinzufügen? Wäre bisschen komisch), so ist die addToolBar-Methode die im QMainWindow anheim ist. Dort wird dann die ToolBar hinzugefügt.
BlackJack

@Sophus: `exitAction` ist kein Attribut sondern ein lokaler Name.

Es wird nicht `addToolBar` an das Attribut gebunden sondern der Rückgabewert der Methode. Die Zeichenkette hat nichts mit der `QAction` zu tun. Wie kommst Du darauf? Das sieht für mich immer noch nach „wir raten uns mal zurecht was das vielleicht bedeuten könnte” aus. Und was das zappeln lassen angeht: Ich werde die Dokumentation nicht übersetzen und hier hinschreiben.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Um die Geschichte mit der addToolBar nochmal aufzugreifen, habe ich mal ein paar Zeilen geschrieben, um zu zeigen, wie ich es verstehe, denn am oberen Beispiel ist es etwas blöd.

Code: Alles auswählen

    self.meTool = QToolBar()
    self.addToolBar(self.meTool)


Ich binde zunächste die QToolBat an das Attribut meTool und im nächsten Schritt füge ich zur Methode addToolBar nun das Attribut meTool hinzu. Denn wie der Name dieser Methode schon sagt, soll eine Toolbar hinzugefügt werden. Da die ToolBar selbst keine Methode addToolBar besitzt (Wieso denn auch? Sich selbst hinzufügen? Wäre bisschen komisch), so ist die addToolBar-Methode die im QMainWindow anheim ist. Dort wird dann die ToolBar hinzugefügt.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Nun, ich hoffe mal, dass ich es richtig gelöst habe. Es funktioniert nun. Die QToolButton sind jetzt in der QToolBar. Für Anmerkungen bin ich sehr dankbar. Also sei ruhig streng, BlackJack :-)

Code: Alles auswählen

from PyQt4.QtGui import QMenu, QApplication, QToolBar, \
    QToolButton, QMainWindow, QAction, QIcon

from PyQt4.QtCore import QSize, Qt

import sys

class Dialog_01(QMainWindow):
    def __init__(self):
        super(QMainWindow, self).__init__()
        #---------------------------------------------------------------------------------------------------
        self.toolbutton = QToolButton()
        self.toolbutton.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
        self.actionPic = self.toolbutton.setIcon(QIcon('Stamp.png'))
        self.actionText = self.toolbutton.setText('  QToolButton  ')
        #---------------------------------------------------------------------------------------------------
        self.toolmenu = QMenu()
        self.action = self.toolmenu.addAction(QIcon('Stamp.png'), "MenuItem1")
        self.action1 = self.toolmenu.addAction(QIcon('Stamp.png'), "MenuItem1")
        #---------------------------------------------------------------------------------------------------
        self.action.triggered.connect(self.someMethod1)
        self.action1.triggered.connect(self.someMethod2)
        #---------------------------------------------------------------------------------------------------
        self.toolbutton.setMenu(self.toolmenu)
        self.toolbutton.setPopupMode(QToolButton.InstantPopup)
        #---------------------------------------------------------------------------------------------------
        self.too = QToolBar()
        self.too.addWidget(self.toolbutton)
        self.too.setIconSize(QSize(80, 32))
        self.addToolBar(self.too)
    #---------------------------------------------------------------------------------------------------
    def someMethod1(self):
        print "someMethod1"
    def someMethod2(self):
        print "someMethod2"
    #---------------------------------------------------------------------------------------------------
if __name__ == '__main__':
    app = QApplication(sys.argv)
    dialog_1 = Dialog_01()
    dialog_1.show()
    dialog_1.resize(480,320)
    sys.exit(app.exec_())
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Code: Alles auswählen

self.actionPic = self.toolbutton.setIcon(QIcon('Stamp.png'))
self.actionText = self.toolbutton.setText('  QToolButton  ')
Das macht keinen Sinn. Hast du denn die Objekte actionPic und actionText mal geprüft, also welchen Wert diese tatsächlich besitzen?
setIcon und setText besitzen keinen Rückgabewert (siehe Doku: void setIcon(), void setText() ), daher weist du an der Stelle auch nichts zu.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@Madmartigan: Du hast völlig Recht. Ich hoffe, ich interpretiere richtig. Du meinst, ich könnte getrost auf actionPic und actionText verzichten?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wenn du ein paar Attribute unbedingt mit None belegen willst, dann solltest du sie behalten. Sonst sind die Rückgabewerte eher sinnlos.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Sophus hat geschrieben:[...] Du meinst, ich könnte getrost auf actionPic und actionText verzichten?
Exakt :)
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Madmartigan hat geschrieben:
Sophus hat geschrieben:[...] Du meinst, ich könnte getrost auf actionPic und actionText verzichten?
Exakt :)
Danke euch :-)
Antworten