2010-11-10 7 views
5

Desidero utilizzare un approccio, quando la maggior parte dei comandi dell'applicazione è presente in QActions, in modo che sia possibile trascinare facilmente le azioni nel menu, nella barra degli strumenti, nel pulsante o in qualsiasi altra cosa. Quindi, ho bisogno di implementare un tale pulsante. È facile scrivere una classe, che la manterrà, prendere icona, testo, scorciatoia e suggerimento da essa e connettere clic() a triggerato(). Ma non posso nemmeno forzare la proprietà 'azione' del mio pulsante nel designer. Sembra che solo i tipi di QVariant holdable possano apparire nel suo editor di proprietà.Come posso implementare il pulsante, che contiene un'azione (QAction) e può connettersi con uno in fase di progettazione in QtDesigner?

MA! I troll lo hanno fatto in qualche modo, quindi il compito dovrebbe essere raggiungibile. Quindi, qualche suggerimento?

risposta

6

Non sono sicuro, ma capisco che si dispone di un'azione (creata con QtDesigner) e si desidera associare questa azione a un menu, a un pulsante della barra degli strumenti ea un pulsante normale.

Con QtDesigner, è facile utilizzare QAction come voce di menu e come pulsante della barra degli strumenti.

Se si desidera utilizzare questo QAction con un pulsante normale, suppongo che non è possibile farlo solo con Qt Designer.

Il mio suggerimento è di aggiungere sul modulo, con QtDesigner a QToolButton.

In te costruttore della classe, si può quindi dire al QToolButton che è collegato al QAction con setDefaultAction().

ui->toolButton->setDefaultAction(ui->actionHello); 

Potrebbe essere necessario regolare di conseguenza la geometria del QToolButton.

Ora, se si fa clic su di esso, l'azione actionHello viene attivata.

+0

Naturalmente , Posso aggiungere un'azione a QWidget e connettere i segnali appropriati. Ma non è quello di cui ho bisogno. Voglio trovare un modo per implementare una classe che accetterà QActions, inclusa in esso in fase di progettazione. –

+0

Almeno, ho trovato una soluzione un po 'idiota: QToolBar, corretto nella parte inferiore del modulo e stile personalizzato, che tiene premuti i pulsanti della barra degli strumenti a destra e posiziona il testo dietro l'icona. 8 \ –

+0

Grazie @jerome! Questo funziona per me. – swdev

-1

Penso che sia necessario implementare alcune azioni specifiche. Verificare se QtDesigner ha un tipo Mime specifico per i suoi componenti. Tutto ciò che è drag and drop deve essere implementato in questo modo. Naturalmente non è semplice per farlo bene;)

+0

È abbastanza staightforvard, ma se solo fosse così semplice. Nessun meccanismo per l'aggregazione di tipi non QVariant è stato trovato da me nella meccanica dei plugin di QtDesiger. –

3

Basta aggiungere qui per tutti coloro che cercano una soluzione simile

https://qt-project.org/wiki/PushButton_Based_On_Action

Header

#ifndef ACTIONBUTTON_H 
#define ACTIONBUTTON_H 

#include <QPushButton> 
#include <QAction> 

/*! 
    *\brief An extension of a QPushButton that supports QAction. 
    * This class represents a QPushButton extension that can be 
    * connected to an action and that configures itself depending 
    * on the status of the action. 
    * When the action changes its state, the button reflects 
    * such changes, and when the button is clicked the action 
    * is triggered. 
    */ 
class ActionButton : public QPushButton 
{ 
    Q_OBJECT 

private: 

    /*! 
     * The action associated to this button. 
     */ 
    QAction* actionOwner; 


public: 
    /*! 
     * Default constructor. 
     * \param parent the widget parent of this button 
     */ 
    explicit ActionButton(QWidget *parent = 0); 

    /*! 
     * Sets the action owner of this button, that is the action 
     * associated to the button. The button is configured immediatly 
     * depending on the action status and the button and the action 
     * are connected together so that when the action is changed the button 
     * is updated and when the button is clicked the action is triggered. 
     * \param action the action to associate to this button 
     */ 
    void setAction(QAction* action); 


signals: 

public slots: 
    /*! 
     * A slot to update the button status depending on a change 
     * on the action status. This slot is invoked each time the action 
     * "changed" signal is emitted. 
     */ 
    void updateButtonStatusFromAction(); 


}; 

#endif // ACTIONBUTTON_H 

Classe

#include "actionbutton.h" 

ActionButton::ActionButton(QWidget *parent) : 
    QPushButton(parent) 
{ 
    actionOwner = NULL; 
} 

void ActionButton::setAction(QAction *action) 
{ 

    // if I've got already an action associated to the button 
    // remove all connections 

    if(actionOwner != NULL && actionOwner != action){ 
     disconnect(actionOwner, 
        SIGNAL(changed()), 
        this, 
        SLOT(updateButtonStatusFromAction())); 

     disconnect(this, 
        SIGNAL(clicked()), 
        actionOwner, 
        SLOT(trigger())); 
    } 


    // store the action 
    actionOwner = action; 

    // configure the button 
    updateButtonStatusFromAction(); 



    // connect the action and the button 
    // so that when the action is changed the 
    // button is changed too! 
    connect(action, 
      SIGNAL(changed()), 
      this, 
      SLOT(updateButtonStatusFromAction())); 

    // connect the button to the slot that forwards the 
    // signal to the action 
    connect(this, 
      SIGNAL(clicked()), 
      actionOwner, 
      SLOT(trigger())); 
} 

void ActionButton::updateButtonStatusFromAction() 
{ 
    setText(actionOwner->text()); 
    setStatusTip(actionOwner->statusTip()); 
    setToolTip(actionOwner->toolTip()); 
    setIcon(actionOwner->icon()); 
    setEnabled(actionOwner->isEnabled()); 
    setCheckable(actionOwner->isCheckable()); 
    setChecked(actionOwner->isChecked()); 

} 
Problemi correlati