Russian Qt Forum
Сентябрь 30, 2024, 10:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Какими способами можно вызывать выпадающее меню на кнопке?  (Прочитано 9605 раз)
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« : Апрель 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)? Или может как-то еще можно создавать меню появляющее при нажатии на кнопку?
« Последнее редактирование: Апрель 06, 2015, 15:14 от billy4685 » Записан
Bepec
Гость
« Ответ #1 : Апрель 06, 2015, 15:24 »

Создайте свой класс, наследуемый от кнопки с собственным поведением. Ничего сложного нет.

PS дело десяти минут.
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #2 : Апрель 06, 2015, 15:28 »

Создайте свой класс, наследуемый от кнопки с собственным поведением. Ничего сложного нет.

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

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Апрель 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);
}
Неужели класс надо городить?  Улыбающийся
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #4 : Апрель 06, 2015, 15:58 »

Воспользуйтесь QToolButton с QToolButton::setPopupMode
Записан

billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #5 : Апрель 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);
}
Неужели класс надо городить?  Улыбающийся
спасибо не знал этого)
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #6 : Апрель 06, 2015, 16:30 »

Воспользуйтесь QToolButton с QToolButton::setPopupMode
Пробовал, там можна в качестве параметра к этой функции передавать QToolButton::DelayedPopup, QToolButton::MenuButtonPopup и QToolButton::InstantPopup. Перепробовал все, но треугольник отображается все равно, только вот при QToolButton::MenuButtonPopup он как отдельная кнопка работает.
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #7 : Апрель 06, 2015, 17:41 »


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

Как вариант установить setStyleSheet используя QPushButton::menu-indicator.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Апрель 06, 2015, 18:47 »

Боже, какая ожесточенная борьба за экономию аж одной строки! Улыбающийся А вдруг она окажется "позорным велосипедом"? Неее, надо искать "искаропки"
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #9 : Апрель 07, 2015, 14:53 »

Цитировать
Как вариант установить setStyleSheet используя QPushButton::menu-indicator.
спасибо, помогло)) правда хотелось бы знать как это же задается не через qss, но и так сойдет пока.
« Последнее редактирование: Апрель 07, 2015, 16:20 от billy4685 » Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #10 : Апрель 14, 2015, 09:01 »

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

Не стоит искать гибкости у стандартных решений. Гибкость это exec. Готовый функционал это setMenu.

Не парьтесь. Ибо там надо будет лезть в исходники.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.087 секунд. Запросов: 23.