2011-04-17 122 views
9

如何在Qt中创建“下拉按钮”?Qt:下拉按钮?

对于非Qt的例子,请参见: Combination button/dropdown in office

的关键点是,窗口小部件需要的图标的主要操作,并且在视觉上独立的“下拉箭头”,显示辅助图标/动作。

对于辅助选项,单击“下拉箭头”时,应该向用户呈现其他图标的网格以供选择。 (所有的图标,没有文字。)

Qt是否有一个小部件可以做到这一点?

如果不是这样,在Qt中如何创建? (我是一个全新的Qt用户,所以基于Qt设计的解决方案将是理想的。)

谢谢

回答

0

最好的办法是让你自己的QAbstractButton的子类使用。你会想要在指定的部分绘制常规图标,并在其他区域绘制自己的图标。您还需要抓住鼠标按下事件来显示弹出菜单(如果它位于指定区域中)(而不是让常规按钮处理代码执行该操作,这会在释放鼠标时导致按钮单击的信号) 。

+0

谢谢。你能推荐任何教程吗?我从来没有归类过一个小部件。不完全确定图纸应该如何发生。 – nonot1 2011-04-21 04:16:12

+0

@ nonot1:有点晚,但请尝试http://doc.trolltech.com/latest/widgets-analogclock.html获取基本概述,以及http://doc.trolltech.com/latest/widgets-calculator.html特别覆盖了一种按钮。他们只是示例而不是教程,但应该帮助你一些。 – 2011-04-27 21:22:07

0

我有同样的问题。我没有找到任何适合的小部件。我使用两个按钮解决了问题,而第二个边距设置为0,并且有一个小的自绘箭头图标。你可以在这里看到:

enter image description here 在左侧,一次在垂直中心,一次在底部。

此解决方案存在缺陷。在OS X中的第二个按钮是不是绘制像一个普通的按钮(因为自定义边距),并伸出丑陋的矩形灰色按钮...

0

我想你会想继承QComboBox并重新实​​现所需的功能/外观(带的paintEvent或者其他东西)作为它看起来最接近你想要的东西(我猜)。

祝你好运!

4

我从一个按钮为我以前的项目创建了一个firefoxlooking下拉菜单。基本上我subclass QPushButton并做了一些自定义绘画。然后,我添加菜单使用功能(QPushButton.setMenu(Qmenu)所附的图像显示是什么样子那个按钮。

Dropbutton

7

你必须使用一个QToolButton。然后,你可能要设置一个图标而不是按钮的文本,将popupmenmen的属性设置为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> 
1

您可以在常规按钮上使用setMenu()

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

我不认为菜单扩展为兼虽然...