QWidget动态布局

在Qt中,要使QWidget上的控件保持大小不变且随窗口动态调整位置,需重载resizeEvent函数,而非使用布局管理器。布局管理器会导致控件随窗口大小变化。文章通过一个工具箱功能的例子,展示如何在停靠窗口上实现动态布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   QWidget上放置的控件,如果想要保证自己的控件大小不变并能根据窗口的大小动态调整位置,则需要重载QWidget下的resizeEvent(函数原型:voidresizeEvent(QResizeEvent*);)函数,该函数用于重新计算窗口并布局。

      使用布局管理器并不能实现该功能,由于布局管理器会根据窗口大小进行相应的放大和缩小,其上面的控件跟着对应变化,所以只能重载该函数来实现窗口的动态布局。


Example:仍以工具箱的实现为例跟之前的文章: 

Qt在停靠窗口上添加控件(实现工具箱功能) 对比


//头文件内容如下:

#ifndef TOOLKIT_H
#define TOOLKIT_H


#define BUTTONWIDTH 16
#define BUTTONHEIGHT 16
#define WIDTHINTERVAL 21
#define HEIGHTINTERVAL 21
#define LINEWIDTH 30

#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QButtonGroup>
#include <QSize>
#include <QVector>

class CToolkit : public QWidget
{
    Q_OBJECT
public:
    explicit CToolkit(QWidget *parent = 0);
    ~CToolkit();
    
signals:
    
public slots:

private:
    void initUI();
    //basic buttons
    QPushButton * basPotBtn;               //draw pointer
    QPushButton * basLineBtn;              //draw line
    QPushButton * basPolygonaLineBtn;      //draw polygon line
    QPushButton * basArcBtn;               //draw arc
    QPushButton * basCurveBtn;             //draw curve
    QPushButton * basBasselCurveBtn;       //draw bassel curve
    QPushButton * basRectangleBtn;         //draw rectangle
    QPushButton * basRoundRectBtn;         //draw round rectangle
    QPushButton * basCircleBtn;            //draw circle
    QPushButton * basSectorBtn;            //draw sector
    QPushButton * basHalfCirBtn;           //draw half circle
    QPushButton * basPolygonBtn;           //draw polygon
    QPushButton * basEnclosedCurBtn;       //draw closed curve
    QPushButton * basEnclosedBasselCurBtn; //draw closed bassel curve
    QPushButton * basTextBtn;              //draw text
    QPushButton * basPumpBtn;              //draw pump

    //extension buttons
    QPushButton *extPotBtn;                 //draw point
    QPushButton *extBtnBtn;                 //draw button
    QPushButton *extPicBtn;                 //draw picture
    QPushButton *extTreLineBtn;             //draw trend line
    QPushButton *extAlaWndBtn;              //draw alarm window
    QPushButton *extXYTreBtn;               //draw XY trend
    QPushButton *extEveWndBtn;              //draw event window
    QPushButton *extVerRuleBtn;             //draw vertical ruler
    QPushButton *extHorRuleBtn;             //draw horizontal ruler
    QPushButton *extBarPicBtn;              //draw bar picture
    QPushButton *extMenuBtn;                //draw menu
    QPushButton *extRepBtn;                 //draw report

    //UI buttons
    QPushButton *UIPotBtn;                 //draw point
    QPushButton *UIBtnBtn;                 //draw button
    QPushButton *UICheBtn;                 //draw checkbox
    QPushButton *UITextBtn;                //draw textedit
    QPushButton *UIComBtn;                 //draw combobox
    QPushButton *UILstBtn;                 //draw listbox
    QPushButton *UISigBtn;                 //draw siglebox
    QPushButton *UITreeBtn;                //draw treeview
    QPushButton *UICalBtn;                 //draw calender
    QPushButton *UIMulTextBtn;             //draw multify textedit
    QPushButton *UIDateBtn;                //draw datetime
    QPushButton *UIRelBtn;                 //draw  relative datetime
    QPushButton *MulTreeBtn;               //draw multify treeview


private:
    //用于在绘制的时候确定要绘制哪一个图形
    QButtonGroup *m_pBasGropBox;
    QButtonGroup *m_pExtGropBox;
    QButtonGroup *m_pUIGropBox;

    //把已经创建的三组按钮分别保存用于在重新布局时使用
    QVector<QPushButton*> mBasBtns;
    QVector<QPushButton*> mExtBtns;
    QVector<QPushButton*> mUIBtns;

    void addBtnsToGroupBox();
    void addBtnsToVector();

public slots:
    void basicGroupBoxClicked(int);
    void extensionGroupBoxClicked(int);
    void UIGroupBoxClicked(int);

public:
    int mDrawType;     //1 indicate basic type, 2 indicate extension type, 3 indicate UI type
    int mDrawIndex;    //mDrawIndex从-1开始递减

private:

    //初始化基本、扩展和UI按钮
    void createBasicBtns();
    void createExtensionBtns();
    void createUIBtns();

    int mBasLineHeiLoc;         //基本按钮上面的线条的相对高度
    int mExtLineHeiLoc;         //扩展按钮上面的线条的相对高度
    int mUILineHeiLoc;          //UI按钮上面的线条的相对高度
    int mCurLocWidth;           //当前在窗口中的相对宽度
    int mCurLocHeight;          //当前在窗口中的相对高度
    int mWndWidth;              //当前窗口的宽度

    //保存基本属性按钮和扩展按钮的个数,用于布局时高度的计算
    int mBasicBtnNums;
    int mExtBtnNums;
    //由于写的控制布局的算法当刚好能整行放完的时候,会导致下一组的按钮的高度位置多加了一次,所以此处设置此值用来控制高度能正确计算
    int mMode;

    //用于显示信息的标签
    QLabel *basicLab;
    QLabel *extLab;
    QLabel *UILab;


    //resize the buttons location
    void resizeEvent(QResizeEvent *);

    void resizeBasicBtns();
    void resizeExtensionBtns();
    void resizeUIBtns();

    //重载此函数用于绘制标签下的直线
    void paintEvent(QPaintEvent *event);
};

#endif // TOOLKIT_H




//实现文件内容如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值