如何在Qt中调整无框小部件的大小

时间:2013-09-13 16:02:04

标签: qt resize

我正在研究如何在Qt 5.1中调整无框小部件的大小。由于跨平台考虑,与Windows相关的代码将不合适。

现在我的方法是:当用户将鼠标悬停在窗口边缘(窗口小部件)时,光标形状会改变,提示此时窗口可以调整大小。单击然后拖动后,将显示一个橡皮带,以显示窗口将调整大小的矩形区域。一旦用户释放鼠标,橡皮带就会消失,然后窗口会调整到所需的大小。我明白了吗?

由于Qt不能直接在屏幕上绘图,作为临时搭建,使用完整的屏幕截图(放入QLabel)来模拟实际屏幕,然后可以在全屏QLabel中构建橡皮带。用户似乎在实际窗口屏幕中拖动窗口。

我的问题是:在用户点击主窗口小部件后,虽然显示了全屏QLabel,但橡皮带拒绝出现。相反,只有在先释放鼠标然后再次单击并拖动后才会出现橡皮筋。

虽然我已将一个“MouseButtonRelease”事件发送到主窗口小部件并将“MouseMove”事件发送到标签,但它似乎不起作用。任何提示或建议都将受到高度赞赏,非常感谢!

(为了简化代码,已删除任何其他额外代码)

mainwidget.h

    class MainWidget : public QWidget
    {
        Q_OBJECT

    public:
        MainWidget(QWidget *parent = 0);
        ~MainWidget();

    private:
        QScreen *screen;

        QLabel *fullScreenLabel;
        QPixmap fullScreenPixmap;
        QRubberBand *rubberBand;

    protected:
        virtual bool eventFilter(QObject *o, QEvent *e);

        void mousePressEvent(QMouseEvent *e);
    };

mainwidget.cpp

    MainWidget::MainWidget(QWidget *parent)
        : QWidget(parent)
    {
        this->setWindowFlags(Qt::FramelessWindowHint);
        screen = QGuiApplication::primaryScreen();
        rubberBand=NULL;

        fullScreenLabel=new QLabel();
        fullScreenLabel->installEventFilter(this);

        resize(600,450);
    }

    MainWidget::~MainWidget()
    {
        delete fullScreenLabel;
    }

    bool MainWidget::eventFilter(QObject *o, QEvent *e)
    {
        if(o!=fullScreenLabel)
            return QWidget::eventFilter(o,e);

        QMouseEvent *mouseEvent=static_cast<QMouseEvent*>(e);

        if(mouseEvent->type()==QEvent::MouseMove)
        {
            qDebug()<<"label mouse move: "<< mouseEvent->pos();
            if(!rubberBand)
            {
                rubberBand=new QRubberBand(QRubberBand::Rectangle,fullScreenLabel);
                rubberBand->setGeometry(QRect(this->pos(),QSize()));
                rubberBand->show();
            }

            rubberBand->setGeometry(QRect(this->pos(),mouseEvent->pos()).normalized());

            return true;
        }

        if((mouseEvent->button()==Qt::LeftButton)
                && (mouseEvent->type()==QEvent::MouseButtonRelease))
        {        
            if(rubberBand)
            {
                rubberBand->hide();
                delete rubberBand;
                rubberBand=NULL;
            }

            return true;
        }
        return false;
    }

    void MainWidget::mousePressEvent(QMouseEvent *e)
    {
        if(screen)
        {
            fullScreenPixmap=QPixmap();
            fullScreenPixmap=screen->grabWindow(0,0,0,-1,-1);
        }

        fullScreenLabel->setPixmap(fullScreenPixmap);
        fullScreenLabel->showFullScreen();

        QMouseEvent clickEvent(QEvent::MouseButtonRelease,
                               e->pos(),
                               Qt::LeftButton,
                               Qt::LeftButton,
                               Qt::NoModifier);
        qApp->sendEvent(this,&clickEvent);

        QMouseEvent moveEvent(QEvent::MouseMove,
                               this->pos(),
                               Qt::NoButton,
                               Qt::NoButton,
                               Qt::NoModifier);
        qApp->sendEvent(fullScreenLabel,&moveEvent);
    }

1 个答案:

答案 0 :(得分:1)

您可以在Qt中研究它是如何完成的 - QSizeGrip。有same question