QWidget上放置的控件,如果想要保证自己的控件大小不变并能根据窗口的大小动态调整位置,则需要重载QWidget下的resizeEvent(函数原型:voidresizeEvent(QResizeEvent*);)函数,该函数用于重新计算窗口并布局。
使用布局管理器并不能实现该功能,由于布局管理器会根据窗口大小进行相应的放大和缩小,其上面的控件跟着对应变化,所以只能重载该函数来实现窗口的动态布局。
Example:仍以工具箱的实现为例跟之前的文章:
//头文件内容如下:
#ifndef TOOLKIT_H
#define TOOLKIT_H
#define BUTTONWIDTH 16
#define BUTTONHEIGHT 16
#define WIDTHINTERVAL 21
#define HEIGHTINTERVAL 21
#define LINEWIDTH 30
#include
#include
#include
#include
#include
#include
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 mBasBtns;
QVector mExtBtns;
QVector 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;
//由于写的控制布局的
//实现文件内容如下:
#include "toolkit.h"
#include
#include
#include
CToolkit::CToolkit(QWidget *parent) :
QWidget(parent)
{
initUI();
}
CToolkit::~CToolkit()
{
//basic buttons
delete basPotBtn; //draw pointer
delete basLineBtn; //draw line
delete basPolygonaLineBtn; //draw polygon line
delete basArcBtn; //draw arc
delete basCurveBtn; //draw curve
delete basBasselCurveBtn; //draw bassel curve
delete basRectangleBtn; //draw rectangle
delete basRoundRectBtn; //draw round rectangle
delete basCircleBtn; //draw circle
delete basSectorBtn; //draw sector
delete basHalfCirBtn; //draw half circle
delete basPolygonBtn; //draw polygon
delete basEnclosedCurBtn; //draw closed curve
delete basEnclosedBasselCurBtn; //draw closed bassel curve
delete basTextBtn; //draw text
delete basPumpBtn; //draw pump
//extension buttons
delete extPotBtn; //draw point
delete extBtnBtn; //draw button
delete extPicBtn; //draw picture
delete extTreLineBtn; //draw trend line
delete extAlaWndBtn; //draw alarm window
delete extXYTreBtn; //draw XY trend
delete extEveWndBtn; //draw event window
delete extVerRuleBtn; //draw vertical ruler
delete extHorRuleBtn; //draw horizontal ruler
delete extBarPicBtn; //draw bar picture
delete extMenuBtn; //draw menu
delete extRepBtn; //draw report
//UI buttons
delete UIPotBtn; //draw point
delete UIBtnBtn; //draw button
delete UICheBtn; //draw checkbox
delete UITextBtn; //draw textedit
delete UIComBtn; //draw combobox
delete UILstBtn; //draw listbox
delete UISigBtn; //draw siglebox
delete UITreeBtn; //draw treeview
delete UICalBtn; //draw calender
delete UIMulTextBtn; //draw multify textedit
delete UIDateBtn; //draw datetime
delete UIRelBtn; //draw relative datetime
delete MulTreeBtn; //draw multify treeview
}
void CToolkit::initUI()
{
mDrawType = 0;
mDrawIndex = 0;
mBasLineHeiLoc = 0;
mExtLineHeiLoc = 0;
mUILineHeiLoc = 0;
mBasicBtnNums = 16;
mExtBtnNums = 12;
createBasicBtns();
createExtensionBtns();
createUIBtns();
addBtnsToGroupBox();
addBtnsToVector();
}
<