Qt自定义标题栏并实现放大缩小和移动功能(包括鼠标双击)
程序员文章站
2022-07-13 23:02:39
...
首先重写mouseMoveEvent和mouseReleaseEvent事件,以及事件过滤器。
public:
//鼠标移动事件
void mouseMoveEvent(QMouseEvent *event);
//鼠标释放事件
void mouseReleaseEvent(QMouseEvent *event);
//事件过滤器
bool eventFilter(QObject *obj,QEvent *event);
//改变窗口大小
void turnView();
private:
//鼠标相对窗体的位置
QPoint m_pos;
//是否按下
bool m_bPressed;
//是否最大化
bool m_bMaxView;
//最大尺寸和上一次的尺寸
QRect m_maxRect,m_norRect;
然后在构造函数中为控件注册事件过滤器。并初始化变量。
m_bPressed = false;
m_bMaxView = false;
//注册自定义标题栏
ui->groupBox->installEventFilter(this);
//注册窗口自身
this->installEventFilter(this);
//获取电脑屏幕尺寸
m_maxRect = QApplication::desktop()->avaliableGeometry();
接下来实现重写的鼠标事件
void MainView::mouseMoveEvent(QMouseEvent *event)
{
if(m_bPressed){
if(m_bMaxView){
//缩小到原先界面大小
setGeometry(m_maxRect.x(),m_maxRect.y(),m_norRect.width(),m_norRect.height());
m_bMaxView = false;
}
}
//鼠标相对电脑屏幕的位置,左上角为原点
QPoint movePos = event->globalPos();
QPoint pt(movePos - m_pos);
//移动主窗体位置
move(pt);
}
void MainView::mouseReleaseEvent(QMouseEvent *event)
{
m_bPressed = false;
event->ignore();
}
eventFilter 过滤事件
bool MainView::eventFilter(QObject *obj,QEvent *event)
{
QMouseEvent * mouseEvent = static<QMouseEvent *>(event);
if(obj == ui->groupBox){
if(event->type() == QEvent::MouseButtonDbclick && mouseEvent->button() == Qt::LeftButton){
turnView();
return false;
}
}
else if(obj == this){
if(event->type() == QEvent::MouseButtonPress && mouseEvent->button() == Qt::LeftButton){
m_bPressed = true;
m_pos = mouseEvent->pos;
return false;
}
}
return QObject::eventFilter(obj,event);
}
turnView 界面最大化和恢复正常
void MainView::turnView()
{
if(m_bMaxView){
setGeometry(m_norRect); //设置为上一次大小
m_bMaxView = false;
return;
}
m_norRect = geometry(); //记录当前大小
move(0,0);
setGeometry(m_maxRect); //最大化
m_bMaxView = true;
}
就可以了。
下一篇: java swing 自定义标题栏及拖动