Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Hybrid View

  1. #1

    [Python] Rendere cliccabile un elemento

    Salve a tutti,
    sto imparando Python da qualche mese e quindi la domanda potrà sembrare banale, ma esiste un modo "generico" per rendere cliccabile un elemento in un'interfaccia grafica?
    Quando dico generico intendo dire relativo a una libreria che valga però per tutti o almeno per quanti più elementi possibili.

    Io utilizzo le Qt v.5 e vorrei capire se posso rendere cliccabile un elemento diverso da un qpushbutton e un qtoolbutton come per esempio una forma geometrica disegnata.
    Qualcosa di simile all'evento onclick di Javascript che può essere applicato a qualsiasi elemento della pagina web.
    C'è un modo di fare questa cosa?

    Grazie a chi mi risponderà.
    I dilettanti costruirono l'Arca, i professionisti il Titanic!

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    QWidget e quindi tutti le classi derivate implementano i segnali di cui hai bisogna, puoi guardare sulla documentazione ufficiale ci sono anche svariati esempi disponibili online
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Sì ma se una classe non è derivata da QWidget posso renderla cliccabile ugualmente? O devo fare una nuova classe che erediti da quella che mi serve e da QWidget per usare i segnali? Volevo proprio capire quale era la procedura da seguire in questi casi
    I dilettanti costruirono l'Arca, i professionisti il Titanic!

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    In genere tutto ciò che aggiungi alla tua interfaccia grafica deriva direttamente o indirettamente da QWidget. In caso non fosse così sono oggetti disegnati all'interno di un contenitore che deriva da QWidget il quale offre i segnali che ti servono, come associare un click a un sotto oggetto sta però a te visto che la logica per disegnarli l'hai data tu.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    ma se volessi rendere cliccabile un oggetto QRect() come potrei fare?

    Ho provato a farlo derivare da QWidget e a ridefinire mousePressEvent in questo modo

    codice:
    class Rect(QRectF,QWidget):
        def __init_(self,a,b,c,d):
            QRectF.__init__(a,b,c,d)
            
            
        def mousePressEvent(self, QMouseEvent):
            if QMouseEvent.button() == Qt.LeftButton:
                print("Left")
            elif QMouseEvent.button() == Qt.RightButton:
                    #do what you want here
                print("Right")
    ma mi dà questo errore:

    TypeError: QWidget(parent: QWidget = None, flags: Union[Qt.WindowFlags, Qt.WindowType] = Qt.WindowFlags()): argument 1 has unexpected type 'int'
    I dilettanti costruirono l'Arca, i professionisti il Titanic!

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    QRect è un oggetto per la gestione della geometria, non fatto per essere aggiunto direttamente all'interfaccia grafica.
    Per disegnare un QRect ti serve un QPainter, per avere un painter devi avere un QWidget di contesto, questo QWidget di contesto può gestire la pressione del mouse, da quello puoi prendere la posizione del click e grazie ai metodi forniti da QRect puoi vedere se il punto è incluso nel tuo rettangolo e in quel caso gestire l'evento.
    In alternativa puoi usare una QWidget (es QLabel) con una funzione custom di draw che disegni il rettangolo e imposti le dimensioni giuste della label e gestire direttamente l'evento sulla label
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    OK grazie, mi sono dovuto fiondare nel mondo python direttamente con le QT e sto cercando di capire un po' come funzionano
    La tua spiegazione è stata molto chiara, ora farò un po' di esperimenti e vediamo! Grazie ancora

    Un'altra domanda.

    Esiste una scelta preferenziale tra usare il QPainter o la QLabel? A livello prestazionale intendo (o secondo altri criteri). Tieni conto che dovrò disegnare una serie di rettangoli da rendere cliccabili che potrà andare da un centinaio fino a un migliaio.
    I dilettanti costruirono l'Arca, i professionisti il Titanic!

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Usare un widget per rettangolo ti permette di mantenere il codice più pulito e lasciare a Qt la gestione degli eventi, quindi è più semplice da implementare e mantenere
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  9. #9
    Ok inizio a capire il meccanismo.

    Ho scritto questa classe che sovrascrive il metodo che gestisce i click del mouse.
    codice:
     
    
    class WidRect(QWidget):
          
        def __init__(self, mIntMeasureId,mStrLabel=None):
            super().__init__()
            self.aIntMeasureId=mIntMeasureId
            self.aStrLabel=mStrLabel
            #self.setWidget(QLabel(mStrLabel))
            
        def getLabel():
            return self.aStrLabel;
        
        
        def mousePressEvent(self, QMouseEvent):
            if QMouseEvent.button() == Qt.LeftButton:
                print("Left Button Clicked on measure "+ str(self.aIntMeasureId))
            elif QMouseEvent.button() == Qt.RightButton:
                    #do what you want here
                print("Right Button Clicked on measure "+ str(self.aIntMeasureId))

    Funziona tutto ma dovrei aggiungere del testo e/o un'immagine nel rettangolo. Come posso aggiungere un widget a un altro widget? Se provo a usare setWidget o addWidget nel costruttore mi dice che l'oggetto non possiede quel metodo.
    Sbaglio il ragionamento di base? Non è possibile aggiungere un widget a un altro?
    Grazie ancora dell'aiuto
    I dilettanti costruirono l'Arca, i professionisti il Titanic!

  10. #10
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    QLabel può fare già tutto quello di cui hai bisogno, questo è un esempio minimale, ci sono svariati esempi su come mostrare un'immagine in una QLabel online, puoi approfondire il resto con una ricerca su google.
    codice:
    from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
    from PyQt5.QtCore import Qt
    import sys
    
    class Rect(QLabel):
        def __init__(self, w=200, h=100, color="red", text="", callback=None):
            super().__init__()
            self.setFixedSize(w, h)
            self.setStyleSheet("QLabel {background-color: "+color+";}")
            self.setText(text)
            self.setAlignment(Qt.AlignCenter)
            if callback==None:
                callback = lambda x: None
            self.callback = callback
        
        def mousePressEvent(self, e):
            self.callback(e)
    
    app = QApplication(sys.argv)
    
    window = QWidget()
    layout = QVBoxLayout()
    layout.addWidget(Rect())
    layout.addWidget(Rect(400, 200, "yellow", "rosa", lambda e: print("yellow")))
    layout.addWidget(Rect(300, 150, "blue", "rosae", lambda e:print("blue")))
    window.setLayout(layout)
    window.setWindowTitle("Rects")
    window.show()
    sys.exit(app.exec_())
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.