• 10270阅读
  • 8回复

使用QWidget,flags= Qt::WStyle_NoBorder ,如何通过拖拉改变窗体大小 [复制链接]

上一主题 下一主题
离线jackychu
 

只看楼主 倒序阅读 楼主  发表于: 2008-06-26
— 本帖被 XChinux 执行加亮操作(2008-06-27) —
我使用QWidget, flags= Qt::WStyle_NoBorder | Qt::WStyle_Customize,这样就去除了缩小,放大,关闭按钮,然后我设置了背景图片,但是我仍然想通过拖拉改变窗体大小,同时图片也随着窗体改变,请高手帮忙,给点意见

以下是我的代码.
Test::Test(QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags= Qt::WStyle_NoBorder | Qt::WStyle_Customize)
{
    ui.setupUi(this);

    QPixmap *pm_back_buffer = new QPixmap("images/bg.png");       
    setBackgroundPixmap(*pm_back_buffer);

    const QIcon iconExit = QIcon(QString::fromUtf8("images/exit.png"));
    ui.exitButton->setIcon(iconExit);

    connect(ui.exitButton, SIGNAL(clicked()), this,SLOT(close()));
}
离线duduqq

只看该作者 1楼 发表于: 2008-06-26
重写mousePressEvent(),mouseMoveEvent()
当鼠标按下时,在mouseMeveEvnet()里让窗体move(pos()) ;
离线jackychu

只看该作者 2楼 发表于: 2008-06-26
duduqq  你好:

我代码里的两个函数如下,你能帮我改一下吗?
QPoint last, pos0;

void ddd::mouseMoveEvent(QMouseEvent *e)
{
    QPoint newpos = e->globalPos();
    QPoint upleft = pos0 + newpos - last;
    move(upleft);
}

void ddd::mousePressEvent(QMouseEvent *e)
{
    last = e->globalPos();
    pos0 = e->globalPos() - e->pos();
}
离线duduqq

只看该作者 3楼 发表于: 2008-06-26
就这样就可以移动了啊
离线jackychu

只看该作者 4楼 发表于: 2008-06-27
移动是可以的,另外我想通过拖拉边缘改变窗体的大小,我碰到就是这个问题,拖拉不了
离线duduqq

只看该作者 5楼 发表于: 2008-06-27
那就得重写mousePressEvent()
设置某些区域为鼠标按下时窗体可以改变大小的,当鼠标在这些区域按下时,窗体的大小随着鼠标的移动而变化
离线jackychu

只看该作者 6楼 发表于: 2008-06-27
我分析也是要重构这个函数,但是因为我也才学Qt,试了一些方法还没试通.你能不能帮我改一些代码,我把.cpp和.h文件发上来,希望你能抽空帮我解决,先谢谢了.
test.h文件
#ifndef DDD_H
#define DDD_H

#include <QtGui/QWidget>
#include "ui_test.h"
#include <qevent.h>

class test: public QWidget
{
    Q_OBJECT

public:
  test(QWidget *parent = 0, Qt::WFlags flags = 0);
  ~test();

    virtual void mousePressEvent(QMouseEvent *);
    virtual void mouseMoveEvent(QMouseEvent *);
    virtual void resizeEvent(QResizeEvent *);

private:
    Ui::dddClass ui;
    QPoint last, pos0;
};

#endif // TEST_H

test.cpp文件
#include "test.h"

test::test(QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags=  Qt::WStyle_NoBorder | Qt::WStyle_Customize )
{
    ui.setupUi(this);

    QPixmap *pm_back_buffer = new QPixmap("images/bg.png");       
    setBackgroundPixmap(*pm_back_buffer);

    const QIcon iconExit = QIcon(QString::fromUtf8("images/exit.png"));
    ui.exitButton->setIcon(iconExit);

    connect(ui.exitButton, SIGNAL(clicked()), this,SLOT(close()));

    setActiveWindow();
    setMinimumSize(266, 538);
    resize(266, 538);
}

test::~test()
{

}


void test::mouseMoveEvent(QMouseEvent *e)
{
    QPoint newpos = e->globalPos();
    QPoint upleft = pos0 + newpos - last;
    move(upleft);
}

void test::mousePressEvent(QMouseEvent *e)
{
    last = e->globalPos();
    pos0 = e->globalPos() - e->pos();
}

void test::resizeEvent(QResizeEvent *e)
{
    int extraWidth = width() - minimumWidth();
    int extraHeight = height() - minimumHeight();
    ui.exitButton->setGeometry(240 + extraWidth, 10, 21, 21);
}
离线duduqq

只看该作者 7楼 发表于: 2008-06-27
我只能和你讲讲思路
先设一个区域,例如在右下角那个位置QRect(width()-10,height()-10,height(),height()),
当鼠标在那个位置按下时,设置一个标志位为真
改变窗体大小的代码在mouseMoveEvent()里写, width(),heigth()随着鼠标event->x(),y()的移动和变化
离线jackychu

只看该作者 8楼 发表于: 2008-06-27
谢谢duduqq,意思我明白了,我先试试看
快速回复
限100 字节
 
上一个 下一个