qt禁止拖动_[Qt]QMdiArea,无框架窗口的拖动

本文介绍了如何在Qt中禁止QMdiArea子窗口的拖动,以及实现无框架窗口的拖动和大小调整。通过设置子窗口大小、重写QPressEvent和QMoveEvent来实现拖动效果,并利用eventFilter处理子窗口事件。同时讲解了如何让主窗口透明而子窗口不透明,以及使QPushButton按下后隐藏边框的方法。
摘要由CSDN通过智能技术生成

0:QMdiArea中添加子窗口后,想固定or调整窗口的大小

需要在addSubWindow()函数调用后返回子窗口的指针,然后再设置子窗口的大小

注意设置imagelabel的大小是没有效果的,imagelabel只是作为一个widget添加到了子窗口中

QImage colorImage(filename);

QLabel * imagelabel =new QLabel;

imagelabel->setPixmap(QPixmap::fromImage(colorImage));

imagelabel->setAttribute(Qt::WA_DeleteOnClose);

imagelabel->setWindowTitle(title);

imagelabel->setFixedSize(colorImage.size()); //没有效果哦

imagelabel->setMaximumSize(colorImage.size()); //没有效果哦

imagelabel->setMinimumSize(colorImage.size()); //没有效果哦

ui->mdiArea->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

QMdiSubWindow *sw =ui->mdiArea->addSubWindow(imagelabel);

sw->setFixedSize(colorImage.size().width()+10,colorImage.size().height()+30); //有效果哦

imagelabel->show();

1:重写QPressEvent and QMoveEvent实现在无框架窗口中拖动widget时,主窗口位置移动

void Form::mousePressEvent(QMouseEvent *event)

{

if (event->button() == Qt::LeftButton) {

dragPosition = event->globalPos() - frameGeometry().topLeft();

event->accept();

}

}

void Form::mouseMoveEvent(QMouseEvent *event)

{

if (event->buttons() & Qt::LeftButton)

{

move(event->globalPos() - dragPosition);

event->accept();

}

}

2:在主窗口中重写 bool eventFilter(QObject target, QEvente)

这样做的好处是,只需要这个eventFilter,就可以处理所有子widget的事件处理函数了

非常强大的功能

实现方法也非常容易:

##1:在构造函数中注册相关子widget,这样主窗口就可以事先捕获到本来应该传递给子widget的事件

ui->pushButton->installEventFilter(this);

##2:在eventFilter(QObject *target, QEvent *e)函数中,实现对子窗口事件的处理

如下为一个例子:

bool eventFilter(QObject *target, QEvent *e)

{

if(target == ui->pushButton) //确实事件本来应该传递的对象

{

QMouseEvent *temp=(QMouseEvent *)e; //强制事件类型转换

if(e->type() == QEvent::MouseButtonPress)//确定事件处理类型

{

//对事件进行处理

qcout<

pos = temp->globalPos() - frameGeometry().topLeft();

temp->accept();

}

if(e->type()== QEvent::MouseMove) //确定事件处理类型

{

//对事件进行处理

qcout<

move(temp->globalPos() - pos);

temp->accept();

}

}

return false;

}

##关于QEvent的type(),我们可以看下面的网址(当然在Qt官网查也是可以的):

http://www.xuebuyuan.com/2147501.html

4:实现主窗口透明,子widet不透明的方法

##1:构造函数中添加如下函数

setWindowFlags(Qt::FramelessWindowHint);

setAttribute(Qt::WA_TranslucentBackground, true);

##2:void paintEvent()函数重写

protected:

void paintEvent(QPaintEvent *event)

{

QPainter painter(this);

painter.fillRect(this->rect(), QColor(0, 0, 255, 80)); //QColor最后一个参数80代表背景的透明度,0为完全透明

}

3:QPushButton在按下后不显示边框

ui->pushButton->setStyleSheet("border-style:hidden;");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值