2017年12月11日 星期一

Qt--QMdiArea,无框架窗口的拖动

[Qt]QMdiArea,无框架窗口的拖动


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, QEvent e)

  • 这样做的好处是,只需要这个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<<"mouse pressed"<<endl;

                    pos = temp->globalPos() - frameGeometry().topLeft();
                    temp->accept();
                }
                if(e->type()== QEvent::MouseMove)  //确定事件处理类型
                {
                  //对事件进行处理
                    qcout<<"mosue moved"<<endl;
                    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);
    
##2void 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;");

沒有留言:

張貼留言