2010-11-10 9 views
5

Uygulama komutlarının çoğu QActions uygulamasında tutulduğu zaman, bir davranışı kullanmak istiyorum; böylece, eylemleri kolayca menüye veya araç çubuğuna veya düğüme veya herhangi bir şeye sürükleyebilirim. Yani, böyle bir butona ihtiyacım var. Bir sınıf yazmak, tutmak, simge, metin, kısayol ve araç ipucu almak ve tıklattı() tetiklenen() için bir sınıf yazmak kolaydır. Ancak düğmemdeki 'eylem' özelliğini tasarımcıya bile zorlayamıyorum. Görünüşe göre, yalnızca QVariant için katlanabilen türler özellik düzenleyicide görünebilir.Bir eylemi (QAction) tutan ve QtDesigner'daki bir tasarlamayla bağlantı kurabilen düğmeyi nasıl uygularım?

AMA! Troller bir şekilde yaptı, bu yüzden görev başarılabilir olmalıydı. Yani, herhangi bir öneri?

cevap

6

Emin değilim, ancak bir eyleminiz olduğunu (QtDesigner ile oluşturulmuştur) anladığınızı ve bu eylemi bir menü, bir araç çubuğu düğmesi ve normal bir düğme ile ilişkilendirmek istediğinizi anlıyorum.

QtDesigner ile, bir menü öğesi olarak QAction ve araç çubuğu düğmesi olarak kullanımı kolaydır.

Bu QAction numaralı telefonu normal bir düğme ile kullanmak isterseniz, bunu yalnızca Qt Designer ile yapamazsınız.

Öngörülerim, formunuzu QtDesigner a QToolButton ile eklemektir.

Sınıf kurucusunda, QToolButton numarasını QAction numaralı setDefaultAction() numaralı telefona bağladığını bildirebilirsiniz.

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

buna göre QToolButton geometrisini ayarlamak gerekebilir.

Şimdi, eğer üzerine tıklarsanız, actionHello eylemi tetiklenecektir.

+0

arayan herkes için buraya ekleyerek QWidget'e bir eylem ekleyebilir ve uygun sinyalleri bağlayabilirim. Ama ihtiyacım olan şey bu değil. QActions'ı kabul edecek bir sınıfi uygulamak için bir yol bulmak istiyorum, bu esnada düştü. –

+0

En azından, biraz aptalca bir çözüm buldum: QToolBar, formun alt kısmında sabitlenmiş ve özel stil, araç çubuğu düğmelerini sağa sabitler ve simgenin arkasına metni yerleştirir. 8 \ –

+0

Teşekkürler @jerome! Bu benim için çalışıyor. – swdev

-1

Belirli bir düşüş eylemi uygulamanız gerektiğini düşünüyorum. QtDesigner'ın bileşenleri için belirli Mime-Type'a sahip olup olmadığına bakın. Sürükleyip bırakılan her şey bu şekilde uygulanmalıdır. Tabii doğru olsun çalışma değildir;)

+0

Oldukça hızlı bir şekilde, ancak sadece bu kadar basit olsaydı. QtDesiger eklenti mekaniğinde, QVariant olmayan tür kümeleme için hiçbir mekanizma bulunmadı. –

3

Sadece Tabii benzer solüsyon

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

Başlık

#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 

Sınıf

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

} 
İlgili konular