工具栏按钮下拉菜单
2014-12-04 20:11
204 查看
这里要实现的是这样一种界面效果,点击工具栏上的一个按钮,在这个按钮的下面弹出一个下拉菜单,这给分组式工具条设计带来不少便利。
这种样式在execl中非常常见。
实现的核心思想是:创建一个弹出式菜单,将其弹出的位置设置在按钮的下面。当然,可以从按钮对象派生一个对象实现这个功能。这里使用的从一个窗体对象派生,在其内部聚合了一个按钮和菜单对象。
struct GZLTMenuData
{
int pos;
int para;
GZLTMenuData(){}
GZLTMenuData(int p,int a):pos(p),para(a){}
};
Q_DECLARE_METATYPE(GZLTMenuData)
class GZLTBorderWidget : public QWidget
{
Q_OBJECT
public:
GZLTBorderWidget(QWidget * parent = NULL);
signals:
void signalBorderSetting(int pos,int para);
public slots:
void onClick();
void onTriggered(QAction * action);
protected:
void addMenuSeparator();
void addMenuItem(const QIcon & icon,const QString & text,const GZLTMenuData & data);
protected:
QLabel * m_icon;
QPushButton * m_button;
QHBoxLayout * m_layout;
QMenu * m_menu;
};
GZLTBorderWidget::GZLTBorderWidget(QWidget * parent)
:QWidget(parent)
{
//ppp = parent;
m_icon = new QLabel;
m_button = new QPushButton(this);
m_layout = new QHBoxLayout;
m_menu = new QMenu(this);
m_layout->addWidget(m_icon);
m_layout->addWidget(m_button);
this->setLayout(m_layout);
m_icon->setFixedSize(20,20);
m_button->setFixedSize(20,20);
QIcon defaultIcon(":/res/icon/border01.png");
m_icon->setPixmap(defaultIcon.pixmap(20));
m_button->setIcon(QIcon(":/res/icon/selButton.png"));
addMenuItem(QIcon(":/res/icon/border01.png"),QStringLiteral("左框线"),
GZLTMenuData(BORDER_POS_LEFT,BORDER_PARA_SMALLLINE));
addMenuItem(QIcon(":/res/icon/border01.png"),QStringLiteral("右框线"),
GZLTMenuData(BORDER_POS_RIGHT,BORDER_PARA_SMALLLINE));
addMenuItem(QIcon(":/res/icon/border01.png"),QStringLiteral("上框线"),
GZLTMenuData(BORDER_POS_TOP,BORDER_PARA_SMALLLINE));
addMenuItem(QIcon(":/res/icon/border01.png"),QStringLiteral("下框线"),
GZLTMenuData(BORDER_POS_BUTTOM,BORDER_PARA_SMALLLINE));
addMenuSeparator();
addMenuItem(QIcon(":/res/icon/border01.png"),QStringLiteral("去除左框线"),
GZLTMenuData(BORDER_POS_LEFT,BORDER_PARA_NOLINE));
addMenuItem(QIcon(":/res/icon/border01.png"),QStringLiteral("去除右框线"),
GZLTMenuData(BORDER_POS_RIGHT,BORDER_PARA_NOLINE));
addMenuItem(QIcon(":/res/icon/border01.png"),QStringLiteral("去除上框线"),
GZLTMenuData(BORDER_POS_TOP,BORDER_PARA_NOLINE));
addMenuItem(QIcon(":/res/icon/border01.png"),QStringLiteral("去除下框线"),
GZLTMenuData(BORDER_POS_BUTTOM,BORDER_PARA_NOLINE));
connect(m_button,SIGNAL(clicked()),SLOT(onClick()));
connect(m_menu,SIGNAL(triggered(QAction*)),SLOT(onTriggered(QAction*)));
}
void GZLTBorderWidget::addMenuItem(const QIcon & icon,const QString & text,const GZLTMenuData & data)
{
QAction * action = m_menu->addAction(icon,text);
action->setData(QVariant::fromValue(data));
}
void GZLTBorderWidget::addMenuSeparator()
{
m_menu->addSeparator();
}
void GZLTBorderWidget::onClick()
{
QWidget * parent = this->parentWidget();
QPoint pt = this->pos();
QPoint st = parent->mapToGlobal(pt);
st.setY(st.y()+this->height());
m_menu->popup(st);
}
void GZLTBorderWidget::onTriggered(QAction * action)
{
if(action)
{
QIcon icon = action->icon();
m_icon->setPixmap(icon.pixmap(20));
GZLTMenuData data = action->data().value<GZLTMenuData>();
emit signalBorderSetting(data.pos,data.para);
}
}
这种样式在execl中非常常见。
实现的核心思想是:创建一个弹出式菜单,将其弹出的位置设置在按钮的下面。当然,可以从按钮对象派生一个对象实现这个功能。这里使用的从一个窗体对象派生,在其内部聚合了一个按钮和菜单对象。
struct GZLTMenuData
{
int pos;
int para;
GZLTMenuData(){}
GZLTMenuData(int p,int a):pos(p),para(a){}
};
Q_DECLARE_METATYPE(GZLTMenuData)
class GZLTBorderWidget : public QWidget
{
Q_OBJECT
public:
GZLTBorderWidget(QWidget * parent = NULL);
signals:
void signalBorderSetting(int pos,int para);
public slots:
void onClick();
void onTriggered(QAction * action);
protected:
void addMenuSeparator();
void addMenuItem(const QIcon & icon,const QString & text,const GZLTMenuData & data);
protected:
QLabel * m_icon;
QPushButton * m_button;
QHBoxLayout * m_layout;
QMenu * m_menu;
};
GZLTBorderWidget::GZLTBorderWidget(QWidget * parent)
:QWidget(parent)
{
//ppp = parent;
m_icon = new QLabel;
m_button = new QPushButton(this);
m_layout = new QHBoxLayout;
m_menu = new QMenu(this);
m_layout->addWidget(m_icon);
m_layout->addWidget(m_button);
this->setLayout(m_layout);
m_icon->setFixedSize(20,20);
m_button->setFixedSize(20,20);
QIcon defaultIcon(":/res/icon/border01.png");
m_icon->setPixmap(defaultIcon.pixmap(20));
m_button->setIcon(QIcon(":/res/icon/selButton.png"));
addMenuItem(QIcon(":/res/icon/border01.png"),QStringLiteral("左框线"),
GZLTMenuData(BORDER_POS_LEFT,BORDER_PARA_SMALLLINE));
addMenuItem(QIcon(":/res/icon/border01.png"),QStringLiteral("右框线"),
GZLTMenuData(BORDER_POS_RIGHT,BORDER_PARA_SMALLLINE));
addMenuItem(QIcon(":/res/icon/border01.png"),QStringLiteral("上框线"),
GZLTMenuData(BORDER_POS_TOP,BORDER_PARA_SMALLLINE));
addMenuItem(QIcon(":/res/icon/border01.png"),QStringLiteral("下框线"),
GZLTMenuData(BORDER_POS_BUTTOM,BORDER_PARA_SMALLLINE));
addMenuSeparator();
addMenuItem(QIcon(":/res/icon/border01.png"),QStringLiteral("去除左框线"),
GZLTMenuData(BORDER_POS_LEFT,BORDER_PARA_NOLINE));
addMenuItem(QIcon(":/res/icon/border01.png"),QStringLiteral("去除右框线"),
GZLTMenuData(BORDER_POS_RIGHT,BORDER_PARA_NOLINE));
addMenuItem(QIcon(":/res/icon/border01.png"),QStringLiteral("去除上框线"),
GZLTMenuData(BORDER_POS_TOP,BORDER_PARA_NOLINE));
addMenuItem(QIcon(":/res/icon/border01.png"),QStringLiteral("去除下框线"),
GZLTMenuData(BORDER_POS_BUTTOM,BORDER_PARA_NOLINE));
connect(m_button,SIGNAL(clicked()),SLOT(onClick()));
connect(m_menu,SIGNAL(triggered(QAction*)),SLOT(onTriggered(QAction*)));
}
void GZLTBorderWidget::addMenuItem(const QIcon & icon,const QString & text,const GZLTMenuData & data)
{
QAction * action = m_menu->addAction(icon,text);
action->setData(QVariant::fromValue(data));
}
void GZLTBorderWidget::addMenuSeparator()
{
m_menu->addSeparator();
}
void GZLTBorderWidget::onClick()
{
QWidget * parent = this->parentWidget();
QPoint pt = this->pos();
QPoint st = parent->mapToGlobal(pt);
st.setY(st.y()+this->height());
m_menu->popup(st);
}
void GZLTBorderWidget::onTriggered(QAction * action)
{
if(action)
{
QIcon icon = action->icon();
m_icon->setPixmap(icon.pixmap(20));
GZLTMenuData data = action->data().value<GZLTMenuData>();
emit signalBorderSetting(data.pos,data.para);
}
}
相关文章推荐
- MFC工具栏ToolBar按钮添加下拉菜单
- 实现带下拉菜单的工具栏按钮
- VC.NET界面编程中关于的ToolBar(工具栏)的编程应用(二)2008/07/01 19:22 上回说到给工具栏上添加IE风格的下拉菜单按钮,我们通过设置工具栏按钮的风格已经完成了下拉菜单按钮的添加,现在我们准备为下拉菜单按钮中响应下拉箭头部分的实现
- 可变下拉菜单的按钮组 - SWING组件
- 又一个下拉菜单导航按钮
- 如何实现工具栏的下拉箭头按钮
- 在mfc中,如何设置一个隐藏菜单栏,工具栏,状态栏,最大化、最小化、关闭按钮的窗体 分类: MFC
- 五、菜单栏和工具栏(主工具栏上创建按钮)
- C#Windows7任务栏开发Thumbnail Toolbars(缩略图、工具栏按钮)
- VBA添加Excel工具栏按钮
- Vs2010工具栏显示“开始执行“按钮
- 工具栏CToolBar下拉菜单
- (转)FCKeditor如何自定义增加工具栏按钮
- 给按钮添加下拉菜单
- bootstrap-按钮/按钮下拉菜单
- 【转载】C#实现主窗体工具栏上按钮两幅图片的交互效果
- 工具栏按钮与屏幕上的按钮,响应方式的区别
- Bootstrap<基础十四> 按钮下拉菜单
- Bootstrap<基础十四> 按钮下拉菜单
- 用于工具栏和导航栏的标准按钮