Qt - всплывающее меню - PullRequest
       1

Qt - всплывающее меню

5 голосов
/ 24 января 2011

Я добавил метку как изображение (значок) в виджет в Qt. Я хочу отобразить всплывающее меню, когда пользователь нажимает (левой или правой кнопкой мыши) на ярлык. Как мне этого добиться? Пожалуйста, помогите ...

Ответы [ 3 ]

6 голосов
/ 24 января 2011

Вы захотите установить ContextMenuPolicy виджета, затем подключите событие customContextMenuRequested к некоторому слоту, который будет отображать меню.

См .: Qt и контекстное меню

4 голосов
/ 24 января 2011

Если вы хотите отображать контекстное меню при каждом нажатии метки (любой кнопкой мыши), я думаю, вам придется реализовать свой собственный класс Label, унаследовав QLabel и обрабатывая всплывающее меню самостоятельно случай события мыши.

Вот очень упрощенная (но работающая) версия:

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

Этот специализированный класс Label отобразит во всплывающем меню все добавленные к нему действия.

Допустим, главное окно вашего приложения называется MainFrm и отображает метку (label. Вот как будет выглядеть конструктор:

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 голосов
/ 12 октября 2011

Если ярлык кликабелен, логически это «текстовая кнопка », а не « ярлык ».

Я бы предложил вместо этого использовать QToolButton и использовать QSS для создания кнопки инструмента для метки.

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