2010-11-10 7 views
5

Quiero utilizar un enfoque, cuando la mayoría de los comandos de aplicación se mantienen en QActions, de modo que podría arrastrar acciones fácilmente al menú, a la barra de herramientas, a un botón o a cualquier otra cosa. Entonces, necesito implementar dicho botón. Es fácil escribir alguna clase, que la contendrá, tomar ícono, texto, atajo e información sobre herramientas de ella y conectar clicked() a triggered(). Pero ni siquiera puedo forzar la propiedad de "acción" de mi botón en el diseñador. Parece que solo los tipos de QVariant pueden aparecer en su editor de propiedades.¿Cómo puedo implementar el botón, que contiene una acción (QAction) y puedo conectarme con uno en desigtime en QtDesigner?

PERO! Trolls lo hizo de alguna manera, por lo que la tarea debería ser alcanzable. Entonces, ¿alguna sugerencia?

Respuesta

6

No estoy seguro, pero entiendo que tiene una acción (creada con QtDesigner) y desea asociar esta acción con un menú, un botón de la barra de herramientas y un botón normal también.

Con QtDesigner, es fácil utilizar un QAction como un elemento de menú y como un botón de la barra de herramientas.

Si desea utilizar este QAction con un botón normal también, supongo que no puede hacerlo solo con Qt Designer.

Mi sugerencia es agregar su formulario, con QtDesigner a QToolButton.

En tu constructor de clase, puedes decir QToolButton que está conectado a tu QAction con setDefaultAction().

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

Puede que tenga que ajustar en consecuencia la geometría de la QToolButton.

Ahora, si hace clic en él, se activará la acción actionHello.

+0

por supuesto , Puedo agregar una acción a QWidget y conectar las señales apropiadas. Pero no es lo que necesito. Quiero encontrar una manera de implementar una clase que acepte QActions, lanzada en ella en designtime. –

+0

Al menos, encontré una pequeña solución estúpida: QToolBar, fijada en la parte inferior de la forma, y ​​estilo personalizado, que pega los botones de la barra de herramientas a la derecha y coloca el texto detrás del ícono. 8 \ –

+0

Gracias @jerome! Esto funciona para mí – swdev

-1

Creo que debe implementar alguna acción específica. Vea si QtDesigner tiene algún tipo Mime específico para sus componentes. Todo lo que sea arrastrar y soltar debe implementarse de esta manera. Por supuesto que no es fácil de hacer las cosas bien;)

+0

Es bastante estable, pero si fuera tan simple. No encontré ningún mecanismo para la agregación de tipos no QVariant en la mecánica de los complementos de QtDesiger. –

3

Simplemente añadiendo aquí para cualquiera que busque solución similar

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

Cabecera

#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 

Clase

#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()); 

} 
Cuestiones relacionadas