Russian Qt Forum

Qt => Вопросы новичков => Тема начата: billy4685 от Апрель 06, 2015, 15:10



Название: Какими способами можно вызывать выпадающее меню на кнопке?
Отправлено: billy4685 от Апрель 06, 2015, 15:10
Здравствуйте. Задался вопросом: "Какими способами можно вызывать выпадающее меню." То есть чтобы оно появлялось под кнопкой при нажатии на кнопку. Я создавал ранее такое меню двумя следующими способами:
1. Используя setMenu(menu):
Код:
    .............
    QPushButton *but = new QPushButton(this);
    but->setText("Menu");
    but->show();

    QMenu *menu = new QMenu;
    menu->addAction("1");
    menu->addAction("2");
    menu->addAction("3");

    but->setMenu(menu);
    ...................
2 Используя exec(but->cursor().pos()):
Код:
   // в *.h файле
   ......................
  
   private:
    QMenu *menu;
    QPushButton *but;

    public slots:
         void menuShow();
  
    ......................

   // в *.ccp
   ......................
  
    // в конструкторе
    but = new QPushButton(this);
    but->setText("Menu");
    but->show();

    menu = new QMenu;
    menu->addAction("1");
    menu->addAction("2");
    menu->addAction("3");

    connect(but, SIGNAL(clicked()), this, SLOT(menuShow()));  
  
   ......................

   // описание слота
   void MainWindow::menuShow()
   {
        menu->exec(but->cursor().pos());
   }

   .......................  
Первый способ хорош тем, что меню идеально появляется под кнопкой, не налазя на нее. Второй дает возможность отобразить меню в том месте где стоит курсор во время нажатия на кнопку. То есть меню будет перекрывать немного кнопку.

Я хотел бы отобразить меню так как в первом способе, ну чтобы на кнопке не рисовался треугольник, по нажатию на который и отображается меню. Конечно же можно использовать второй способ, только вместо exec(but->cursor().pos()) указывать exec(), а меню задать расположение относительно x и y. Но это запаристо каждый раз задавать позицию расположения меню. Может в Qt существует какой-нибудь флаг, который убирает этот треугольник, который появляется при использовании функции setMenu(menu)? Или может как-то еще можно создавать меню появляющее при нажатии на кнопку?


Название: Re: Какими способами можно вызывать выпадающее меню на кнопке?
Отправлено: Bepec от Апрель 06, 2015, 15:24
Создайте свой класс, наследуемый от кнопки с собственным поведением. Ничего сложного нет.

PS дело десяти минут.


Название: Re: Какими способами можно вызывать выпадающее меню на кнопке?
Отправлено: billy4685 от Апрель 06, 2015, 15:28
Создайте свой класс, наследуемый от кнопки с собственным поведением. Ничего сложного нет.

PS дело десяти минут.
Спасибо за совет. Я просто думал что может еще как-то можно. Будем тогда создавать свой класс.


Название: Re: Какими способами можно вызывать выпадающее меню на кнопке?
Отправлено: Igors от Апрель 06, 2015, 15:49
Конечно же можно использовать второй способ, только вместо exec(but->cursor().pos()) указывать exec(), а меню задать расположение относительно x и y. Но это запаристо каждый раз задавать позицию расположения меню.
Что же там такого запаристого?
Код
C++ (Qt)
inline QPoint CalcMenuPosBottom( QWidget * btn )
{
 return QPoint(QCursor:pos.x(), btn->mapToGlobal(btn->geometry().bottomLeft()).y() + 1);
}
Неужели класс надо городить?  :)


Название: Re: Какими способами можно вызывать выпадающее меню на кнопке?
Отправлено: gil9red от Апрель 06, 2015, 15:58
Воспользуйтесь QToolButton с QToolButton::setPopupMode (http://doc.qt.io/qt-4.8/qtoolbutton.html#popupMode-prop)


Название: Re: Какими способами можно вызывать выпадающее меню на кнопке?
Отправлено: billy4685 от Апрель 06, 2015, 16:14
Конечно же можно использовать второй способ, только вместо exec(but->cursor().pos()) указывать exec(), а меню задать расположение относительно x и y. Но это запаристо каждый раз задавать позицию расположения меню.
Что же там такого запаристого?
Код
C++ (Qt)
inline QPoint CalcMenuPosBottom( QWidget * btn )
{
 return QPoint(QCursor:pos.x(), btn->mapToGlobal(btn->geometry().bottomLeft()).y() + 1);
}
Неужели класс надо городить?  :)
спасибо не знал этого)


Название: Re: Какими способами можно вызывать выпадающее меню на кнопке?
Отправлено: billy4685 от Апрель 06, 2015, 16:30
Воспользуйтесь QToolButton с QToolButton::setPopupMode (http://doc.qt.io/qt-4.8/qtoolbutton.html#popupMode-prop)
Пробовал, там можна в качестве параметра к этой функции передавать QToolButton::DelayedPopup, QToolButton::MenuButtonPopup и QToolButton::InstantPopup. Перепробовал все, но треугольник отображается все равно, только вот при QToolButton::MenuButtonPopup он как отдельная кнопка работает.


Название: Re: Какими способами можно вызывать выпадающее меню на кнопке?
Отправлено: PimenS от Апрель 06, 2015, 17:41

Я хотел бы отобразить меню так как в первом способе, ну чтобы на кнопке не рисовался треугольник, по нажатию на который и отображается меню. Конечно же можно использовать второй способ, только вместо exec(but->cursor().pos()) указывать exec(), а меню задать расположение относительно x и y. Но это запаристо каждый раз задавать позицию расположения меню. Может в Qt существует какой-нибудь флаг, который убирает этот треугольник, который появляется при использовании функции setMenu(menu)? Или может как-то еще можно создавать меню появляющее при нажатии на кнопку?

Как вариант установить setStyleSheet используя QPushButton::menu-indicator.


Название: Re: Какими способами можно вызывать выпадающее меню на кнопке?
Отправлено: Igors от Апрель 06, 2015, 18:47
Боже, какая ожесточенная борьба за экономию аж одной строки! :) А вдруг она окажется "позорным велосипедом"? Неее, надо искать "искаропки"


Название: Re: Какими способами можно вызывать выпадающее меню на кнопке?
Отправлено: billy4685 от Апрель 07, 2015, 14:53
Цитировать
Как вариант установить setStyleSheet используя QPushButton::menu-indicator.
спасибо, помогло)) правда хотелось бы знать как это же задается не через qss, но и так сойдет пока.


Название: Re: Какими способами можно вызывать выпадающее меню на кнопке?
Отправлено: billy4685 от Апрель 14, 2015, 09:01
Продолжу данную тему. Заинтерисовал тут один вопрос: "Как разместить меню справа относительно кнопки, если для отображения меню использую but->setMenu(menu)?" Как это сделать через exec() знаю, хочеться сделать это при setMenu(). Может флаг какой-то существует для QMenu?


Название: Re: Какими способами можно вызывать выпадающее меню на кнопке?
Отправлено: Bepec от Апрель 14, 2015, 13:51
Не стоит искать гибкости у стандартных решений. Гибкость это exec. Готовый функционал это setMenu.

Не парьтесь. Ибо там надо будет лезть в исходники.