Qt学习: 鼠标追踪及自定义工具栏.(以美图看看为例)

在主窗口中,除了自带的一个主工具栏,还可以在其他位置放置自定义的QToolBar.但是你会发现,ui页面的mainToolBar的初始位置只能是上下左右四个位置,这里说的是初始位置,因为只要设置了floatable和movetable这两个属性,就可以拖动到指定位置,但如果要实现初始就要在某一特定位置的话,只能够重新定义一个工具栏.

//"c.cpp"内的代码:
#include "c.h"

c::c(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    this->setBaseSize(QSize(1000,800));

    QLayout *layout = this->layout();
    //初始化各个工具按钮,不用细看,只要知道工具栏中可以放部件和QAction即可.
    m_bottomToolBar = new QToolBar(); m_bottomToolBar->setFixedSize(750, 50);
    m_boostButton = new QToolButton(); m_boostButton->setIcon(QIcon("Resources/Icons/boost.ico")); m_boostButton->setFixedSize(50, 50);
    m_reduceButton = new QToolButton(); m_reduceButton->setIcon(QIcon("Resources/Icons/reduce.ico")); m_reduceButton->setFixedSize(50, 50);
    m_sizeHintButton = new QToolButton(); m_sizeHintButton->setIcon(QIcon("Resources/Icons/sizeHint.ico")); m_sizeHintButton->setFixedSize(50, 50);
    m_beautiButton = new QToolButton(); m_beautiButton->setIcon(QIcon("Resources/Icons/beauti.ico")); m_beautiButton->setFixedSize(75, 50); m_beautiButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); m_beautiButton->setText(QString::fromLocal8Bit("美化"));
    m_cutScreenButton = new QToolButton(); m_cutScreenButton->setIcon(QIcon("Resources/Icons/cutScreen.ico")); m_cutScreenButton->setFixedSize(75, 50); m_cutScreenButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); m_cutScreenButton->setText(QString::fromLocal8Bit("截图"));
    m_preciousButton = new QToolButton(); m_preciousButton->setIcon(QIcon("Resources/Icons/precious.ico")); m_preciousButton->setFixedSize(75, 50);
    m_nextButton = new QToolButton(); m_nextButton->setIcon(QIcon("Resources/Icons/next.ico")); m_nextButton->setFixedSize(75, 50);
    m_leftRotateButton = new QToolButton(); m_leftRotateButton->setIcon(QIcon("Resources/Icons/leftRotate.ico")); m_leftRotateButton->setFixedSize(75, 50);
    m_rightRotateButton = new QToolButton(); m_rightRotateButton->setIcon(QIcon("Resources/Icons/rightRotate.ico")); m_rightRotateButton->setFixedSize(75, 50);
    m_delButton = new QToolButton(); m_delButton->setIcon(QIcon("Resources/Icons/clean.ico")); m_delButton->setFixedSize(50, 50);
    m_moreButton = new QToolButton(); m_moreButton->setIcon(QIcon("Resources/Icons/more.ico")); m_moreButton->setFixedSize(50, 50);

    //把工具按钮加到工具栏中...
    m_bottomToolBar->addWidget(m_boostButton);
    m_bottomToolBar->addWidget(m_reduceButton);
    m_bottomToolBar->addWidget(m_sizeHintButton);
    m_bottomToolBar->addWidget(m_beautiButton);
    m_bottomToolBar->addWidget(m_cutScreenButton);
    //加入间隔线.
    m_bottomToolBar->addSeparator();
    m_bottomToolBar->addWidget(m_preciousButton);
    m_bottomToolBar->addWidget(m_nextButton);
    m_bottomToolBar->addSeparator();
    m_bottomToolBar->addWidget(m_leftRotateButton);
    m_bottomToolBar->addWidget(m_rightRotateButton);
    m_bottomToolBar->addWidget(m_delButton);
    m_bottomToolBar->addWidget(m_moreButton);
    //设置菜单栏无法被移动.
    m_bottomToolBar->setMovable(false);
    //设置工具栏的几何属性,位置和宽高.
    m_bottomToolBar->setGeometry(100, 700, 750, 50);
    layout->addWidget(m_bottomToolBar);
    //此处这句代码可有可无.
    //this->setLayout(layout);
}

c::~c()
{

}

至于美图看看中的工具栏是在鼠标经过那片区域时才显示的菜单,实现起来很简单,只需要重写QMouseEvent中的鼠标移动函数即可,当然需要先设置:this->setMouseTracking(true).如果不是主窗口的使用上个函数即可,但如果是在主窗口中,这还是不够的,还需要设置:ui.centralWidget->setMouseTracking(true);这样的话,只要鼠标在移动,而不关注是否点下左键还是右键,就会调用void mouseMoveEvent(QMouseEvent *event)这个函数了.
还有一点就是,每当窗口大小改变时,菜单大小基本是不变的,只是位置相对世界坐标改变了,而相对窗口是不变的,所以只要重写void resizeEvent(QResizeEvent *event)这个虚函数即可.每当窗口大小被改变时,调用这个函数.

//"c.h"内的代码:
#ifndef C_H
#define C_H

#include <QtWidgets/QMainWindow>
#include "ui_c.h"
#include <QToolBar>
#include <QToolButton>
#include <QLayout>

class c : public QMainWindow
{
    Q_OBJECT
public:
    c(QWidget *parent = 0);
    ~c();
private:
    Ui::cClass ui;
    QToolBar *m_bottomToolBar;
    QToolButton *m_boostButton;
    QToolButton *m_reduceButton;
    QToolButton *m_sizeHintButton;
    QToolButton *m_cutScreenButton;
    QToolButton *m_beautiButton;
    QToolButton *m_preciousButton;
    QToolButton *m_nextButton;
    QToolButton *m_leftRotateButton;
    QToolButton *m_rightRotateButton;
    QToolButton *m_delButton;
    QToolButton *m_moreButton;
};

#endif // C_H
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值