воскресенье, 21 июня 2015 г.

QToolButton + QMenu + QGridLayout



Иногда требуется создать меню которое включает в себя другие Widget'ы, приведу пример такого меню из программы psi :


рис 1. Меню которое  включает в себя Widget'ы выровненные по сетки. 

Как то я уже пытался получить ответ на официальном форуме QT, но ответа не дождался, пришлось додумывать самому как это сделать.

Вот соб-но линк по сабжу
  




Как видно из рис.1 widget'ы которые там присутствуют,  выровнены с помощью QGridLayout. Теперь код, который создает аналогичное меню.


 m_lpStatusIconMenu = new QMenu();

 QList<QString> qIconPath;
 qIconPath << ":/Icons/Icons/Images&icon/icons/angry.png"
              << ":/Icons/Icons/Images&icon/icons/bat.png";

 //Создаем Layout сетку
 QGridLayout *Layout = new QGridLayout(ui->toolButton_2);
 //Создаем кнопку
 QToolButton * lpButton = new QToolButton(this);

 //Устанавливаем у кнопки стиль(border(рамка) = 0 px) 
 lpButton->setStyleSheet("border: 0px solid #8f8f91; border-radius: 20px");
 //Устанавливаем иконку
 lpButton->setIcon(QIcon(qIconPath.at(0)));
 //Добавляем в "сетку" где 0, 0 это позиция строка и столбец.
 Layout->addWidget(lpButton, 0, 0);
 //Создаем еще одну кнопку
 lpButton = new QToolButton(this);
 //Устанавливаем иконку
 lpButton->setIcon(QIcon(qIconPath.at(1)));
 //Устанавливаем иконку
 Layout->addWidget(lpButton, 0, 1);
 //Добавляем в "сетку" где 0, 1 это позиция строка и столбец.

 //Теперь нашу сетку добавляем непосредственно в меню, которое будет показываться.
 m_lpStatusIconMenu->setLayout(Layout);
 //И это меню устанавливаем для кнопки QToolButton.
 ui->toolButton_2->setMenu(m_lpStatusIconMenu);

Результат работы :

Как можно наблюдать 1 иконка не имеет рамки 
т.к StyleSheet задан явно.
Вот таким вот способом можно комбинировать, 
добавляя в меню различные widget'ы.






Комментариев нет:

Отправить комментарий