2011-01-24 42 views
5

Ho aggiunto un'etichetta come immagine (icona) a un widget in Qt. Desidero visualizzare un menu a comparsa quando l'utente fa clic (clic sinistro o destro) sull'etichetta. Come posso ottenere questo? Per favore aiuto ...Qt - Menu di scelta rapida

+1

Che cosa vuoi esattamente: un menu a comparsa quando è richiesto il menu contestuale (tasto destro) o un menu a comparsa ogni volta che si fa clic sull'etichetta, non importa se è il pulsante sinistro o destro? –

risposta

6

Dovrai impostare il ContextMenuPolicy del widget, quindi connettere l'evento customContextMenuRequested ad uno slot che visualizzerà il menu.

See: Qt and context menu

4

Se si desidera visualizzare un menu di scelta rapida ogni volta che l'etichetta si fa clic (con qualsiasi tasto del mouse), credo che si dovrà implementare la propria Label classe, che eredita QLabel e la manipolazione del popup menu da soli in caso di un evento del mouse.

Ecco una versione molto semplificata (ma di lavoro):

class Label : public QLabel 
{ 
public: 
    Label(QWidget* pParent=0, Qt::WindowFlags f=0) : QLabel(pParent, f) {}; 
    Label(const QString& text, QWidget* pParent = 0, Qt::WindowFlags f = 0) : QLabel(text, pParent, f){}; 

protected : 
    virtual void mouseReleaseEvent (QMouseEvent * ev) { 
     QMenu MyMenu(this); 
     MyMenu.addActions(this->actions()); 
     MyMenu.exec(ev->globalPos()); 
    } 
}; 

Questa specializzato Label classe visualizzerà nel menu a comparsa tutte le azioni aggiunto ad essa. .

Diciamo che la finestra principale dell'applicazione è chiamato MainFrm e visualizza l'etichetta (label Ecco come il costruttore apparirebbe:

MainFrm::MainFrm(QWidget *parent) : MainFrm(parent), ui(new Ui::MainFrm) 
{ 
    ui->setupUi(this); 

    QAction* pAction1 = new QAction("foo", ui->label); 
    QAction* pAction2 = new QAction("bar", ui->label); 
    QAction* pAction3 = new QAction("test", ui->label); 
    ui->label->addAction(pAction1); 
    ui->label->addAction(pAction2); 
    ui->label->addAction(pAction3); 
    connect(pAction1, SIGNAL(triggered()), this, SLOT(onAction1())); 
    connect(pAction2, SIGNAL(triggered()), this, SLOT(onAction2())); 
    connect(pAction3, SIGNAL(triggered()), this, SLOT(onAction3())); 
} 
0

Se un'etichetta è cliccabile, è logicamente un "testuale tasto "e non un" un'etichetta "più.

vorrei suggerire di usare QToolButton invece, e utilizzare QSS per compensare il toolbutton a un'etichetta.

#define SS_TOOLBUTTON_TEXT(_normal, _hover, _disabled) \ 
    "QToolButton" "{" \ 
    "background:transparent" \ 
    "color:" #_normal ";" \ 
    "}" \ 
    "QToolButton:hover" "{" \ 
    "color:" #_hover ";" \ 
    "}" \ 
    "QToolButton:disabled" "{" \ 
    "color:" #_disabled ";" \ 
    "}" 

.... 

QToolButton *b = new QToolButton; { 
    b->setToolButtonStyle(Qt::ToolButtonTextOnly); 
    b->setStyleSheet(SS_TOOLBUTTON_TEXT(blue, red, gray)); 
    b->setText(QString("[%1]").arg(tr("menu")); 
} 
b->setMenu(menu_to_popup); 
connect(b, SIGNAL(clicked()), b, SLOT(showMenu())); 
Problemi correlati