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
//实现文件内容如下: