2011-01-24 71 views
5

Tôi đã thêm nhãn làm hình ảnh (biểu tượng) vào tiện ích con trong Qt. Tôi muốn hiển thị menu bật lên khi người dùng nhấp (nhấp chuột trái hoặc phải) trên nhãn. Làm thế nào tôi có thể đạt được điều này? Xin hãy giúp ...Qt - Trình đơn bật lên

+1

Bạn muốn chính xác như thế nào: menu bật lên khi menu ngữ cảnh được yêu cầu (nhấp chuột phải) hoặc menu bật lên bất cứ khi nào nhãn được nhấp vào, cho dù đó là nút trái hay phải? –

Trả lời

6

Bạn sẽ muốn đặt ContextMenuPolicy của tiện ích, sau đó kết nối sự kiện customContextMenuRequested với một số vị trí sẽ hiển thị menu.

Xem: Qt and context menu

4

Nếu bạn muốn hiển thị một menu ngữ cảnh khi nhãn được nhấp (với bất kỳ nút chuột), tôi đoán bạn sẽ phải thực hiện lớp Label của riêng bạn, kế thừa QLabel và xử lý các cửa sổ bật lên menu của chính bạn trong trường hợp có sự kiện chuột.

Đây là một rất đơn giản (nhưng làm việc) phiên bản:

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

Lớp này chuyên Label sẽ hiển thị trong menu nội dung của tất cả các hành động được thêm vào nó. .

Hãy nói rằng cửa sổ chính của ứng dụng của bạn được gọi là MainFrm và được hiển thị nhãn (label Đây là cách các nhà xây dựng sẽ xem xét:

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

Nếu một nhãn là nhấp được, nó là một cách logic một "văn bản nút "và không phải là một" nhãn "nữa.

tôi sẽ đề nghị sử dụng QToolButton thay vào đó, và sử dụng QSS, tạo nên toolbutton để một nhãn.

#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())); 
Các vấn đề liên quan