2011-04-17 64 views
9

¿Cómo puedo crear un "botón desplegable" en Qt?Qt: ¿Botón desplegable?

Por ejemplo no Qt, ver: Combination button/dropdown in office

El punto clave es que el widget necesita un icono para la acción principal, y una "flecha desplegable" separar visualmente para mostrar secundarias iconos/acciones.

Al hacer clic en la "flecha hacia abajo" para las opciones secundarias, se debe presentar al usuario una cuadrícula con otros iconos para elegir. (Todos los iconos, sin texto.)

¿Qt tiene un widget que puede hacer esto?

Si no, ¿cómo se puede crear esto en Qt? (Soy un nuevo usuario Qt, por lo que una solución basada en Qt Designer sería ideal.)

Gracias

Respuesta

0

Lo mejor que puede hacer es crear su propia subclase de QAbstractButton. Debería dibujar el ícono regular en la parte designada y su propio ícono en la otra área. También necesitaría tomar el evento de presionar el mouse para mostrar el menú emergente si está en el área designada (en lugar de dejar que lo tome el código regular de manejo de botones, lo que llevaría a una señal de clic cuando se soltó el mouse) .

+0

Gracias. ¿Puedes recomendarme algún tutorial? Nunca he subclasificado un widget. No estoy seguro de cómo se supone que debe pasar el dibujo. – nonot1

+0

@ nonot1: un poco tarde, pero pruebe http://doc.trolltech.com/latest/widgets-analogclock.html para obtener una descripción general básica, y http://doc.trolltech.com/latest/widgets-calculator.html específicamente anula un tipo de botón. Son ejemplos en lugar de tutoriales, pero deberían ayudarlo. –

0

Tuve el mismo problema. No encontré ningún widget adecuado. Resolví el problema usando dos botones, mientras que el segundo tiene márgenes establecidos en 0 y un pequeño ícono de flecha dibujada por uno mismo. Puede verlo aquí:

enter image description here en el lado izquierdo, una vez en el centro vertical, una vez en la parte inferior.

Esta solución es defectuosa. En OS X, el segundo botón no se dibuja como un botón normal (debido a los márgenes personalizados) y sobresale como un feo botón gris rectangular ...

0

Creo que querrá subclase QComboBox y volver a implementar la funcionalidad/apariencia necesaria (con paintEvent o algo así) ya que es el widget que se ve más cercano a lo que estás buscando (supongo).

¡Buena suerte!

4

Creé un menú desplegable de Firefoxlooking desde un botón para mi proyecto anterior. Básicamente, subclasé QPushButton e hice algunas pinturas personalizadas. Luego agregar un menú a ese botón se utiliza la función (QPushButton.setMenu (QMenu). El espectáculo imagen adjunta lo que parece.

Dropbutton

7

Usted tiene que usar un QToolButton. Entonces es posible que desee establecer un icono en lugar del texto del botón, establezca la propiedad popupmenu en menubuttonpopup.Este es mi código:

//widget.cpp: 
#include "widget.h" 
#include "ui_widget.h" 

#include <QtGui> 

Widget::~Widget() 
{ 
    delete ui; 
} 

Widget::Widget(QWidget *parent) : 
    QWidget(parent), 
    ui(new Ui::Widget) 
{ 
    ui->setupUi(this); 
    menu = new QMenu(this); 
    act0 = new QAction("test",this); 
    act1 = new QAction("test1",this); 
    act0->setObjectName("act0"); 
    act1->setObjectName("act1"); 
    menu->addAction(act0); 
    menu->addAction(act1); 
    ui->toolButton->setMenu(menu); 
    connect(ui->toolButton,SIGNAL(clicked()),this,SLOT(slotTest())); 
    connect(act0,SIGNAL(triggered()),this,SLOT(slotTest())); 
    connect(act1,SIGNAL(triggered()),this,SLOT(slotTest())); 
    adjustSize(); 
} 

void Widget::slotTest() 
{ 
    QToolButton *tbtn = qobject_cast<QToolButton*>(sender()); 
    QAction *act = qobject_cast<QAction*>(sender()); 
    if(tbtn) 
    { 
     qDebug() << "event raised by QToolButton: " << tbtn->objectName(); 
    } 
    if(act) 
    { 
     qDebug() << "event raised by QAction: " << act->objectName(); 
    } 
} 

//widget.h: 
#ifndef WIDGET_H 
#define WIDGET_H 

#include <QWidget> 
class QMenu; 
class QAction; 
namespace Ui { 
class Widget; 
} 

class Widget : public QWidget 
{ 
    Q_OBJECT 

public: 
    explicit Widget(QWidget *parent = 0); 
    ~Widget(); 
private slots: 
    void slotTest(); 
private: 
    QMenu *menu; 
    QAction *act0; 
    QAction *act1; 
    Ui::Widget *ui; 
}; 

#endif // WIDGET_H 

//widget.ui: 
<?xml version="1.0" encoding="UTF-8"?> 
<ui version="4.0"> 
<class>Widget</class> 
<widget class="QWidget" name="Widget"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>53</width> 
    <height>40</height> 
    </rect> 
    </property> 
    <property name="windowTitle"> 
    <string>Widget</string> 
    </property> 
    <layout class="QVBoxLayout" name="verticalLayout"> 
    <item> 
    <widget class="QToolButton" name="toolButton"> 
    <property name="text"> 
     <string/> 
    </property> 
    <property name="icon"> 
     <iconset> 
     <normaloff>cerca.png</normaloff>cerca.png</iconset> 
    </property> 
    <property name="popupMode"> 
     <enum>QToolButton::MenuButtonPopup</enum> 
    </property> 
    </widget> 
    </item> 
    </layout> 
</widget> 
<layoutdefault spacing="6" margin="11"/> 
<resources/> 
<connections/> 
</ui> 
1

sólo puede utilizar setMenu() en un botón regular de empuje.

QMenu* menu = new QMenu(this); 
menu->addAction(tr("Sub-action")); 
ui->button->setMenu(menu); 

No creo que la expansión menú es facultativa, aunque ...

Cuestiones relacionadas