Qt: выпадающая кнопка? - PullRequest
       28

Qt: выпадающая кнопка?

11 голосов
/ 17 апреля 2011

Как мне создать "выпадающую кнопку" в Qt?

Для примера не-Qt смотрите: Кнопка комбинации / раскрывающийся список в офисе

Ключевым моментом является то, что виджету требуется значок для основного действия и визуально отдельная «стрелка вниз» для отображения дополнительных значков / действий.

После нажатия на «стрелку раскрывающегося меню» для дополнительных параметров пользователю должна быть представлена ​​сетка из других значков на выбор. (Все значки, без текста.)

Есть ли в Qt виджет, который может это делать?

Если нет, как это можно создать в Qt? (Я новый пользователь Qt, поэтому решение на основе Qt Designer было бы идеальным.)

Спасибо

Ответы [ 8 ]

14 голосов
/ 05 сентября 2012

На самом деле, QToolButton делает это довольно хорошо.

http://qt -project.org / форум / viewthread / 5377

Похоже, что ОП спросил это на форуме Qt и получил лучший ответ. Добавляем его сюда для полноты.

7 голосов
/ 10 октября 2012

Вы должны использовать QToolButton. Тогда вы можете захотеть установить значок вместо текста кнопки, установите для свойства popupmenu значение menubuttonpopup. Это мой код:

//widget.cpp:
#include "widget.h"
#include "ui_widget.h"

#include <QtGui>

Widget::~Widget()
{
    delete ui;
}

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    menu   = new QMenu(this);
    act0 = new QAction("test",this);
    act1 = new QAction("test1",this);
    act0->setObjectName("act0");
    act1->setObjectName("act1");
    menu->addAction(act0);
    menu->addAction(act1);
    ui->toolButton->setMenu(menu);
    connect(ui->toolButton,SIGNAL(clicked()),this,SLOT(slotTest()));
    connect(act0,SIGNAL(triggered()),this,SLOT(slotTest()));
    connect(act1,SIGNAL(triggered()),this,SLOT(slotTest()));
    adjustSize();
}

void Widget::slotTest()
{
    QToolButton *tbtn = qobject_cast<QToolButton*>(sender());
    QAction *act = qobject_cast<QAction*>(sender());
    if(tbtn)
    {
        qDebug() << "event raised by QToolButton: " << tbtn->objectName();
    }
    if(act)
    {
        qDebug() << "event raised by QAction: " << act->objectName();
    }
}

//widget.h:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
class QMenu;
class QAction;
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
private slots:
    void slotTest();
private:
    QMenu *menu;
    QAction *act0;
    QAction *act1;
    Ui::Widget *ui;
};

#endif // WIDGET_H

//widget.ui:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Widget</class>
 <widget class="QWidget" name="Widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>53</width>
    <height>40</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Widget</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item>
    <widget class="QToolButton" name="toolButton">
     <property name="text">
      <string/>
     </property>
     <property name="icon">
      <iconset>
       <normaloff>cerca.png</normaloff>cerca.png</iconset>
     </property>
     <property name="popupMode">
      <enum>QToolButton::MenuButtonPopup</enum>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>
5 голосов
/ 15 сентября 2015

Вы можете просто использовать setMenu() на обычной кнопке.

QMenu* menu = new QMenu(this);
menu->addAction(tr("Sub-action"));
ui->button->setMenu(menu);

Я не думаю, что расширение меню является факультативным, хотя ...

4 голосов
/ 08 сентября 2012

Я создал выпадающее меню Firefoxlooking из кнопки для моего предыдущего проекта.В основном я подкласс QPushButton и сделал некоторые пользовательские рисования.Затем я добавляю к этой кнопке меню с помощью функции (QPushButton.setMenu (Qmenu). Прикрепленное изображение показывает, как оно выглядит.

Dropbutton

1 голос
/ 17 июня 2018

Простое решение на основе Python использует функцию «Activated»:

В Qt Designer, выберите Combo-Box.Затем переименуйте его в QComboBoxName или как хотите.Затем в функции init вставьте этот код:

self.QComboBoxName.activated.connect(self.someFunction)

def someFunction(self): #foo
    text=self.QComboBoxName.currentText()
    #do something with this text string
    if (text=='someString'): #do this 
    else : pass
1 голос
/ 19 апреля 2011

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

0 голосов
/ 18 апреля 2011

Я думаю, вы захотите создать подкласс QComboBox и переопределить необходимую функциональность / внешний вид (с помощью paintEvent или чего-то еще), поскольку его виджет выглядит наиболее близко к тому, что вы ищете (я полагаю).

Удачи!

0 голосов
/ 17 апреля 2011

Я на самом деле не знаю, делает ли это то, что вы хотите ... но попробовать? http://doc.qt.io/archives/4.6/qtoolbutton.html#arrowType-prop

...