(1)原篇幅 37 为最开始整理,整理的不是太完善。重点不突出。故重新整理,但删除了大量的注释,重在突出本 QWidget类的内部逻辑,更易观察其包含了哪些内容。至于不理解的成员函数与属性,内容已不太多了,查阅官方注释即可。
这是篇 37 的超文本链接,那里的注释较完整些
(2)
#ifndef QWIDGET_H
#define QWIDGET_H
#include <QtWidgets/qtwidgetsglobal.h>
#include <QtGui/qwindowdefs.h>
#include <QtCore/qobject.h>
#include <QtCore/qmargins.h>
#include <QtGui/qpaintdevice.h>
#include <QtGui/qpalette.h>
#include <QtGui/qfont.h>
#include <QtGui/qfontmetrics.h>
#include <QtGui/qfontinfo.h>
#include <QtWidgets/qsizepolicy.h>
#include <QtGui/qregion.h>
#include <QtGui/qbrush.h>
#include <QtGui/qcursor.h>
# include <QtGui/qkeysequence.h>
#ifdef QT_INCLUDE_COMPAT
#include <QtGui/qevent.h>
#endif
QT_BEGIN_NAMESPACE
class QLayout;
class QStyle;
class QAction;
class QVariant;
class QWindow;
class QActionEvent;
class QMouseEvent;
class QWheelEvent;
class QHoverEvent;
class QKeyEvent;
class QEnterEvent;
class QFocusEvent;
class QPaintEvent;
class QMoveEvent;
class QResizeEvent;
class QCloseEvent;
class QContextMenuEvent;
class QInputMethodEvent;
class QTabletEvent;
class QDragEnterEvent;
class QDragMoveEvent;
class QDragLeaveEvent;
class QDropEvent;
class QScreen;
class QShowEvent;
class QHideEvent;
class QIcon;
class QBackingStore;
class QPlatformWindow;
class QLocale;
class QGraphicsProxyWidget;
class QGraphicsEffect;
class QRasterWindowSurface;
class QUnifiedToolbarSurface;
class QPixmap;
class QDebug;
template <> //至此,该类型转换函数支持了对到 QWidget * 指针类型的准还
inline QWidget * qobject_cast< QWidget *>( QObject * o)
{
if (!o || !o->isWidgetType()) return nullptr;
return static_cast<QWidget*>(o); //可见,核心还是 c++ 的静态类型转换
}
template <>
inline const QWidget * qobject_cast<const QWidget *>(const QObject * o)
{
if (!o || !o->isWidgetType()) return nullptr;
return static_cast<const QWidget*>(o);
}
#define QWIDGETSIZE_MAX ((1<<24)-1)
//说明本指针类型可以交给 QDebug 输出来调试
Q_WIDGETS_EXPORT QDebug operator<<(QDebug, const QWidget *);
class QWidgetData
{
public:
WId winid;
uint widget_attributes;
Qt::WindowFlags window_flags;
uint window_state : 4;
uint focus_policy : 4;
uint sizehint_forced :1;
uint is_closing :1;
uint in_show : 1;
uint in_set_window_state : 1;
mutable uint fstrut_dirty : 1;
uint context_menu_policy : 3;
uint window_modality : 2;
uint in_destructor : 1;
uint unused : 13;
QRect crect;
mutable QPalette pal;
QFont fnt;
QRect wrect;
};
class QWidgetPrivate;
class Q_WIDGETS_EXPORT QWidget : public QObject, public QPaintDevice
{
Q_OBJECT
Q_DECLARE_PRIVATE(QWidget)
Q_PROPERTY(QString windowTitle //先文本量,再布尔量,再其它,再数字量
READ windowTitle WRITE setWindowTitle
NOTIFY windowTitleChanged) //标题栏的文本
Q_PROPERTY(QIcon windowIcon //标题栏的左上角的图标
READ windowIcon WRITE setWindowIcon
NOTIFY windowIconChanged)
Q_PROPERTY(QString windowIconText // deprecated 废弃
READ windowIconText WRITE setWindowIconText
NOTIFY windowIconTextChanged)
Q_PROPERTY(QString toolTip
READ toolTip WRITE setToolTip)
Q_PROPERTY(int toolTipDuration //以毫秒为单位
READ toolTipDuration WRITE setToolTipDuration)
Q_PROPERTY(QString statusTip //状态栏的提示信息
READ statusTip WRITE setStatusTip)
Q_PROPERTY(QString whatsThis
READ whatsThis WRITE setWhatsThis)
Q_PROPERTY(QString accessibleName //也是提示信息
READ accessibleName WRITE setAccessibleName)
Q_PROPERTY(QString accessibleDescription
READ accessibleDescription
WRITE setAccessibleDescription)
Q_PROPERTY(QString styleSheet
READ styleSheet WRITE setStyleSheet)
Q_PROPERTY(QLocale locale
READ locale WRITE setLocale
RESET unsetLocale)
Q_PROPERTY(QString windowFilePath
READ windowFilePath WRITE setWindowFilePath)
Q_PROPERTY(bool enabled
READ isEnabled WRITE setEnabled)
Q_PROPERTY(bool updatesEnabled
READ updatesEnabled WRITE setUpdatesEnabled
DESIGNABLE false)
Q_PROPERTY(bool focus READ hasFocus)
//此属性表示该小部件是否为模态小部件。默认情况下,此属性为假。
//这个属性只对窗口有意义。模态小部件会阻止所有其他窗口中的小部件获得任何输入。
Q_PROPERTY(bool modal READ isModal)
Q_PROPERTY(Qt::WindowModality windowModality
READ windowModality
WRITE setWindowModality)
//这个属性表示是否为该小部件启用了鼠标跟踪。 如果禁用鼠标跟踪(默认情况),
//则在移动鼠标时按下至少一个鼠标按钮时,小部件仅接收鼠标移动事件。
//如果启用了鼠标跟踪,即使没有按下按钮,小部件也会接收鼠标移动事件。
Q_PROPERTY(bool mouseTracking
READ hasMouseTracking WRITE setMouseTracking)
Q_PROPERTY(bool tabletTracking
READ hasTabletTracking WRITE setTabletTracking)
//此属性表示是否启用了小部件的平板电脑跟踪功能。如果禁用平板电脑跟踪(默认设置),
//则小部件仅在笔与平板电脑接触时或在笔移动时按下至少一个笔按钮时接收平板电脑移动事件。
//如果启用了平板电脑跟踪,即使在接近时悬停,小部件也会接收平板电脑移动事件。
//这有助于监控位置以及旋转和倾斜等辅助属性,并在用户界面中提供反馈。
Q_PROPERTY(bool isActiveWindow READ isActiveWindow)
Q_PROPERTY(bool visible
READ isVisible WRITE setVisible
DESIGNABLE false)
Q_PROPERTY(bool minimized READ isMinimized)
Q_PROPERTY(bool maximized READ isMaximized)
Q_PROPERTY(bool fullScreen READ isFullScreen)
//此属性表示组件是否接受拖动来的其它对象。
//将此属性设置为 true 可以向系统宣布此小部件可能能够接受拖放事件。
//如果小部件是桌面(windowType()==Qt::Desktop),如果另一个应用程序正在使用桌面,则可能失败;
//您可以调用acceptDrops()来测试是否发生这种情况。
//默认情况下,此属性为假。 !警告:不要在拖放事件处理程序中修改此属性。
Q_PROPERTY(bool acceptDrops
READ acceptDrops WRITE setAcceptDrops)
Q_PROPERTY(bool windowModified
READ isWindowModified WRITE setWindowModified)
Q_PROPERTY(bool autoFillBackground
READ autoFillBackground
WRITE setAutoFillBackground)
// 窗口标志是一种类型(如 Qt::Dialog)和零个或更多窗口系统提示的组合
// (如 Qt:FramelessWindowHint)
// 如果该小部件具有类型 Qt::Widget 或 Qt::SubWindow,
// 且它成为窗口(Qt::Window、Qt::Dialog等),则将其放置在桌面上的位置(0,0)。
// 如果该小部件是窗口,且它成为Qt::Widget 或 Qt::Sub Window,
// 则相对于其父级小部件,将其放置在位置(0,0)。
// 注意:当更改窗口的标志时,此函数会调用setParent(),导致小部件被隐藏。
// 你必须调用show()方法使小部件再次可见。
QDOC_PROPERTY(Qt::WindowFlags windowFlags
READ windowFlags
WRITE setWindowFlags)
Q_PROPERTY(QPalette palette //调色板
READ palette WRITE setPalette)
Q_PROPERTY(QFont font
READ font WRITE setFont)
Q_PROPERTY(QCursor cursor //光标
READ cursor WRITE setCursor
RESET unsetCursor)
//这个枚举类型定义了小部件在获取键盘焦点方面可以具有的各种策略。
//enum Qt::FocusPolicy { NoFocus, TabFocus, ClickFocus, WheelFocus...}
Q_PROPERTY(Qt::FocusPolicy focusPolicy
READ focusPolicy
WRITE setFocusPolicy)
//此属性持有小部件的默认布局行为。如果存在一个QLayout来管理此小部件的子元素,
//则使用该布局指定的大小策略。如果没有这样的QLayout则使用此函数的返回值。
//默认策路是Preferred/Preferred,这意味着小部件可以自由调整大小,
//但倾向于返回sizeHint()返回的大小。类似按钮的小部件将设置大小策略,以指定它们可以水平拉伸,
//但垂直固定,这同样适用于lineedit控件(如QLineEdit、QSpinBox或可编辑的QComboBox)和
//其他水平排列的小部件(如QProgressBar)。QToolButton通常是正方形的,
//因此它们允许双向生长支持不同方向的小部件(如QSlider、QScrollBar或QHeader)仅指定
//在相应方向上的拉伸。可以提供滚动条的小部件(通常是 QScrollArea的子类)倾向于
//指定它们可以使用额外的空间并且它们可以使用小于 sizeHint()的空间。
Q_PROPERTY(QSizePolicy sizePolicy
READ sizePolicy
WRITE setSizePolicy)
//这个枚举类型定义了小部件在显示上下文菜单方面可以具有的各种策略。
//enum Qt::ContextMenuPolicy { DefaultContextMenu, ActionsContextMenu, ... };
Q_PROPERTY(Qt::ContextMenuPolicy contextMenuPolicy
READ contextMenuPolicy
WRITE setContextMenuPolicy)
//右对齐布局对于某些语言是必要的,特别是阿拉伯语和希伯来语。
//enum Qt::LayoutDirection { LeftToRight, RightToLeft, LayoutDirectionAuto };
Q_PROPERTY(Qt::LayoutDirection layoutDirection
READ layoutDirection
WRITE setLayoutDirection
RESET unsetLayoutDirection)
//该小部件具有的特定提示输入方法。
//这仅适用于输入小部件。输入法使用它来检索有关输入法应如何操作的提示。
//例如,如果启用了Qt::lmhFormattedNumbersOnly标志,则输入法可能会更改其视觉组件,
//以反映只能输入数字。
//警告:某些小部件需要特定的标志才能按预期工作。
Q_PROPERTY(Qt::InputMethodHints inputMethodHints
READ inputMethodHints
WRITE setInputMethodHints)
Q_PROPERTY(QRect geometry
READ geometry WRITE setGeometry)
Q_PROPERTY(QRect frameGeometry READ frameGeometry)
Q_PROPERTY(QRect normalGeometry READ normalGeometry)
Q_PROPERTY(QRect rect READ rect)
Q_PROPERTY(QRect childrenRect READ childrenRect)
Q_PROPERTY(QRegion childrenRegion READ childrenRegion)
Q_PROPERTY(QSize frameSize READ frameSize)
Q_PROPERTY(QSize size
READ size WRITE resize
DESIGNABLE false STORED false)
Q_PROPERTY(QSize sizeHint READ sizeHint)
//这个属性持有小部件的尺寸增量。当用户调整窗口大小时,大小将以
//sizelncrement().width()像素的水平增量和sizelncrement()height()像素的垂直增量移动,
//以 baseSize()为基础。首选小部件大小是非负整数i和 j。
//请注意,虽然您可以设置所有小部件的大小增量,但它只影响窗口。
//默认情况下,此属性包含宽度为0、高度为0的尺寸。
//警告:在 Windows 下,大小增量没有影响,X11的窗口管理器可能会忽略它。
//机器翻译时,总把 Widget 翻译成小部件,把 window 翻译成窗口。这可能不大准确。
Q_PROPERTY(QSize sizeIncrement
READ sizeIncrement
WRITE setSizeIncrement)
Q_PROPERTY(QSize baseSize
READ baseSize WRITE setBaseSize)
Q_PROPERTY(QSize minimumSizeHint
READ minimumSizeHint)
Q_PROPERTY(QSize minimumSize
READ minimumSize WRITE setMinimumSize)
Q_PROPERTY(QSize maximumSize
READ maximumSize WRITE setMaximumSize)
Q_PROPERTY(int minimumWidth
READ minimumWidth WRITE setMinimumWidth
STORED false
DESIGNABLE false)
Q_PROPERTY(int minimumHeight
READ minimumHeight WRITE setMinimumHeight
STORED false
DESIGNABLE false)
Q_PROPERTY(int maximumWidth
READ maximumWidth WRITE setMaximumWidth
STORED false
DESIGNABLE false)
Q_PROPERTY(int maximumHeight
READ maximumHeight WRITE setMaximumHeight
STORED false
DESIGNABLE false)
Q_PROPERTY(int width READ width)
Q_PROPERTY(int height READ height)
Q_PROPERTY(int x READ x)
Q_PROPERTY(int y READ y)
Q_PROPERTY(QPoint pos
READ pos WRITE move
DESIGNABLE false STORED false)
Q_PROPERTY(double windowOpacity
READ windowOpacity WRITE setWindowOpacity)
private:
void setBackingStore(QBackingStore *store);
bool testAttribute_helper(Qt::WidgetAttribute) const;
QLayout *takeLayout();
friend class QBackingStoreDevice;
friend class QWidgetRepaintManager;
friend class QApplication;
friend class QApplicationPrivate;
friend class QGuiApplication;
friend class QGuiApplicationPrivate;
friend class QBaseApplication;
friend class QPainter;
friend class QPainterPrivate;
friend class QPixmap; // for QPixmap::fill()
friend class QFontMetrics;
friend class QFontInfo;
friend class QLayout;
friend class QWidgetItem;
friend class QWidgetItemV2;
friend class QX11PaintEngine;
friend class QWin32PaintEngine;
friend class QShortcutPrivate;
friend class QWindowSurface;
friend class QGraphicsProxyWidget;
friend class QGraphicsProxyWidgetPrivate;
friend class QStyleSheetStyle;
friend struct QWidgetExceptionCleaner;
friend class QWidgetWindow;
friend class QAccessibleWidget;
friend class QAccessibleTable;
friend class QAccessibleTabButton;
friend class QGestureManager;
friend class QWinNativePanGestureRecognizer;
friend class QWidgetEffectSourcePrivate;
friend Q_WIDGETS_EXPORT QWidgetData *qt_qwidget_data(QWidget *widget);
friend Q_WIDGETS_EXPORT QWidgetPrivate *qt_widget_private(QWidget *widget);
private:
Q_DISABLE_COPY(QWidget)
Q_PRIVATE_SLOT(d_func(), void _q_showIfNotHidden())
Q_PRIVATE_SLOT(d_func(), QWindow *_q_closestWindowHandle())
QWidgetData * data;
protected:
QWidget(QWidgetPrivate & d, QWidget * parent, Qt::WindowFlags f);
public:
enum RenderFlag {
DrawWindowBackground = 0x1,
DrawChildren = 0x2,
IgnoreMask = 0x4
};
Q_DECLARE_FLAGS(RenderFlags, RenderFlag)
explicit QWidget(QWidget * parent = nullptr,
Qt::WindowFlags f = Qt::WindowFlags());
~QWidget();
// Q_PROPERTY(QString windowTitle //先文本量,再布尔量,再其它,再数字量
// READ windowTitle WRITE setWindowTitle
// NOTIFY windowTitleChanged)
QString windowTitle() const;
public Q_SLOTS :
void setWindowTitle(const QString &);
Q_SIGNALS:
void windowTitleChanged(const QString & title);
public:
// Q_PROPERTY(QIcon windowIcon
// READ windowIcon WRITE setWindowIcon
// NOTIFY windowIconChanged)
QIcon windowIcon() const;
void setWindowIcon( const QIcon & icon);
Q_SIGNALS :
void windowIconChanged(const QIcon & icon);
public:
// Q_PROPERTY(QString windowIconText
// READ windowIconText WRITE setWindowIconText
// NOTIFY windowIconTextChanged) // deprecated 废弃
QString windowIconText() const;
void setWindowIconText(const QString &);
Q_SIGNALS :
void windowIconTextChanged(const QString & iconText);
public:
// Q_PROPERTY(QString toolTip
// READ toolTip WRITE setToolTip)
QString toolTip() const;
void setToolTip(const QString &);
// Q_PROPERTY(int toolTipDuration
// READ toolTipDuration WRITE setToolTipDuration)
int toolTipDuration() const;
void setToolTipDuration(int msec);
// Q_PROPERTY(QString statusTip
// READ statusTip WRITE setStatusTip)
QString statusTip() const;
void setStatusTip(const QString &);
// Q_PROPERTY(QString whatsThis
// READ whatsThis WRITE setWhatsThis)
QString whatsThis() const;
void setWhatsThis(const QString &);
// Q_PROPERTY(QString accessibleName
// READ accessibleName WRITE setAccessibleName)
QString accessibleName() const;
void setAccessibleName(const QString & name);
// Q_PROPERTY(QString accessibleDescription
// READ accessibleDescription
// WRITE setAccessibleDescription)
QString accessibleDescription() const;
void setAccessibleDescription(const QString & description);
// Q_PROPERTY(QString styleSheet
// READ styleSheet WRITE setStyleSheet)
QString styleSheet() const;
public Q_SLOTS :
void setStyleSheet(const QString & styleSheet);
public:
// Q_PROPERTY(QLocale locale
// READ locale WRITE setLocale
// RESET unsetLocale)
QLocale locale() const;
void setLocale(const QLocale & locale);
void unsetLocale();
// Q_PROPERTY(QString windowFilePath
// READ windowFilePath WRITE setWindowFilePath)
QString windowFilePath() const;
void setWindowFilePath(const QString & filePath);
// Q_PROPERTY(bool enabled
// READ isEnabled WRITE setEnabled)
bool isEnabled () const;
bool isEnabledTo(const QWidget *) const;
public Q_SLOTS :
void setEnabled (bool);
void setDisabled (bool);
public:
// Q_PROPERTY(bool updatesEnabled
// READ updatesEnabled WRITE setUpdatesEnabled
// DESIGNABLE false)
inline bool updatesEnabled() const;
void setUpdatesEnabled(bool enable);
// Q_PROPERTY(bool focus READ hasFocus) //后面还有属性 focusPolicy
bool hasFocus() const;
public Q_SLOTS :
inline void setFocus() { setFocus(Qt::OtherFocusReason); }
public:
void setFocus(Qt::FocusReason reason);
void clearFocus();
// Q_PROPERTY(bool mouseTracking //鼠标跟踪
// READ hasMouseTracking WRITE setMouseTracking)
bool hasMouseTracking() const;
void setMouseTracking(bool enable);
// Q_PROPERTY(bool tabletTracking //触摸屏跟踪
// READ hasTabletTracking WRITE setTabletTracking)
bool hasTabletTracking() const;
void setTabletTracking(bool enable);
// Q_PROPERTY(bool isActiveWindow READ isActiveWindow)
bool isActiveWindow() const;
// Q_PROPERTY(bool visible
// READ isVisible WRITE setVisible
// DESIGNABLE false)
bool isVisible () const;
bool isVisibleTo(const QWidget *) const;
inline bool isHidden () const;
public Q_SLOTS :
virtual void setVisible (bool visible);
void setHidden (bool hidden );
void show ();
void hide ();
bool close();
public:
// Q_PROPERTY(bool minimized READ isMinimized)
bool isMinimized() const;
public Q_SLOTS :
void showMinimized();
public:
// Q_PROPERTY(bool maximized READ isMaximized)
bool isMaximized() const;
public Q_SLOTS :
void showMaximized();
public:
// Q_PROPERTY(bool fullScreen READ isFullScreen)
bool isFullScreen() const;
public Q_SLOTS :
void showFullScreen();
public:
// Q_PROPERTY(bool acceptDrops
// READ acceptDrops WRITE setAcceptDrops)
bool acceptDrops() const;
void setAcceptDrops(bool on);
// Q_PROPERTY(bool windowModified
// READ isWindowModified WRITE setWindowModified)
bool isWindowModified() const;
public Q_SLOTS :
void setWindowModified(bool);
public:
// Q_PROPERTY(bool autoFillBackground
// READ autoFillBackground
// WRITE setAutoFillBackground)
bool autoFillBackground() const;
void setAutoFillBackground(bool enabled);
// Q_PROPERTY(bool modal READ isModal)
bool isModal() const;
// Q_PROPERTY(Qt::WindowModality windowModality
// READ windowModality
// WRITE setWindowModality)
Qt::WindowModality windowModality() const;
void setWindowModality( Qt::WindowModality windowModality);
// QDOC_PROPERTY(Qt::WindowFlags windowFlags
// READ windowFlags
// WRITE setWindowFlags)
inline Qt::WindowFlags windowFlags() const;
void setWindowFlags(Qt::WindowFlags type);
void overrideWindowFlags(Qt::WindowFlags type);
void setWindowFlag (Qt::WindowType, bool on = true);
// Q_PROPERTY(QPalette palette
// READ palette WRITE setPalette)
const QPalette & palette() const;
void setPalette(const QPalette &);
// Q_PROPERTY(QFont font
// READ font WRITE setFont)
const QFont & font() const;
void setFont(const QFont &);
QFontMetrics fontMetrics() const;
QFontInfo fontInfo() const;
// Q_PROPERTY(QCursor cursor
// READ cursor WRITE setCursor
// RESET unsetCursor)
QCursor cursor() const;
void setCursor(const QCursor &);
void unsetCursor();
// Q_PROPERTY(Qt::FocusPolicy focusPolicy //也有布尔属性 focus,在前面
// READ focusPolicy
// WRITE setFocusPolicy)
Qt::FocusPolicy focusPolicy() const; //焦点策略
void setFocusPolicy(Qt::FocusPolicy policy);
QWidget * focusProxy() const; //焦点代理,一字之差
void setFocusProxy(QWidget *);
// Q_PROPERTY(QSizePolicy sizePolicy
// READ sizePolicy
// WRITE setSizePolicy)
QSizePolicy sizePolicy() const;
void setSizePolicy(QSizePolicy);
inline void setSizePolicy(QSizePolicy::Policy horizontal,
QSizePolicy::Policy vertical);
// Q_PROPERTY(Qt::ContextMenuPolicy contextMenuPolicy
// READ contextMenuPolicy
// WRITE setContextMenuPolicy)
Qt::ContextMenuPolicy contextMenuPolicy() const;
void setContextMenuPolicy(Qt::ContextMenuPolicy policy);
// Q_PROPERTY(Qt::LayoutDirection layoutDirection
// READ layoutDirection
// WRITE setLayoutDirection
// RESET unsetLayoutDirection)
Qt::LayoutDirection layoutDirection() const;
void setLayoutDirection( Qt::LayoutDirection direction );
void unsetLayoutDirection();
// Q_PROPERTY(Qt::InputMethodHints inputMethodHints
// READ inputMethodHints
// WRITE setInputMethodHints)
Qt::InputMethodHints inputMethodHints() const;
void setInputMethodHints( Qt::InputMethodHints hints);
// Q_PROPERTY(double windowOpacity //不透明度
// READ windowOpacity WRITE setWindowOpacity)
qreal windowOpacity() const;
void setWindowOpacity(qreal level);
// Q_PROPERTY(QRect geometry
// READ geometry WRITE setGeometry)
const QRect & geometry() const;
inline void setGeometry(int x, int y, int w, int h);
void setGeometry(const QRect &);
QByteArray saveGeometry() const;
void updateGeometry();
bool restoreGeometry(const QByteArray & geometry);
// Q_PROPERTY(QRect frameGeometry READ frameGeometry)
QRect frameGeometry() const;
// Q_PROPERTY(QRect normalGeometry READ normalGeometry)
QRect normalGeometry() const;
// Q_PROPERTY(QRect rect READ rect)
inline QRect rect() const;
QRect contentsRect() const;
// Q_PROPERTY(QRect childrenRect READ childrenRect)
QRect childrenRect() const;
// Q_PROPERTY(QRegion childrenRegion READ childrenRegion)
QRegion childrenRegion() const;
QRegion visibleRegion() const;
// Q_PROPERTY(QSize frameSize READ frameSize)
QSize frameSize() const;
// Q_PROPERTY(QSize size
// READ size WRITE resize
// DESIGNABLE false STORED false)
QSize size() const;
void resize(int w, int h);
void resize(const QSize &);
// Q_PROPERTY(QSize sizeHint READ sizeHint)
virtual QSize sizeHint() const;
virtual bool hasHeightForWidth() const;
virtual int heightForWidth(int) const;
// Q_PROPERTY(QSize minimumSizeHint
// READ minimumSizeHint)
virtual QSize minimumSizeHint() const;
// Q_PROPERTY(QSize sizeIncrement
// READ sizeIncrement
// WRITE setSizeIncrement)
QSize sizeIncrement() const;
void setSizeIncrement(const QSize &);
void setSizeIncrement(int w, int h);
// Q_PROPERTY(QSize baseSize
// READ baseSize WRITE setBaseSize)
QSize baseSize() const;
void setBaseSize(const QSize &);
void setBaseSize(int basew, int baseh);
// Q_PROPERTY(QSize minimumSize
// READ minimumSize WRITE setMinimumSize)
QSize minimumSize() const;
void setMinimumSize(const QSize &);
void setMinimumSize(int minw, int minh);
// Q_PROPERTY(QSize maximumSize
// READ maximumSize WRITE setMaximumSize)
QSize maximumSize() const;
void setMaximumSize(const QSize &);
void setMaximumSize(int maxw, int maxh);
// Q_PROPERTY(int minimumWidth
// READ minimumWidth WRITE setMinimumWidth
// STORED false
// DESIGNABLE false)
int minimumWidth() const;
void setMinimumWidth(int minw);
// Q_PROPERTY(int minimumHeight
// READ minimumHeight WRITE setMinimumHeight
// STORED false
// DESIGNABLE false)
int minimumHeight() const;
void setMinimumHeight(int minh);
// Q_PROPERTY(int maximumWidth
// READ maximumWidth WRITE setMaximumWidth
// STORED false
// DESIGNABLE false)
int maximumWidth() const;
void setMaximumWidth(int maxw);
// Q_PROPERTY(int maximumHeight
// READ maximumHeight WRITE setMaximumHeight
// STORED false
// DESIGNABLE false)
int maximumHeight() const;
void setMaximumHeight(int maxh);
// Q_PROPERTY(int width READ width)
inline int width() const;
// Q_PROPERTY(int height READ height)
inline int height() const;
// Q_PROPERTY(int x READ x)
int x() const;
// Q_PROPERTY(int y READ y)
int y() const;
// Q_PROPERTY(QPoint pos
// READ pos WRITE move
// DESIGNABLE false STORED false)
QPoint pos() const;
void move(int x, int y);
void move(const QPoint &);
protected : //从保护、公共到槽函数,修改窗体的成员函,结合起来看,学习
void initPainter(QPainter * painter) const override;
void create(WId = 0, bool initializeWindow = true,
bool destroyOldWindow = true);
void destroy(bool destroyWindow = true, bool destroySubWindows = true);
public :
inline
void update(int x, int y, int w, int h);
void update(const QRect &);
void update(const QRegion &);
void repaint(int x, int y, int w, int h);
void repaint(const QRect &);
void repaint(const QRegion &);
protected Q_SLOTS:
void updateMicroFocus(Qt::InputMethodQuery query = Qt::ImQueryAll);
public Q_SLOTS:
void update ();
void repaint();
//void show();
//void hide();
//bool close();
void raise();
void lower();
// void showMinimized();
// void showMaximized();
// void showFullScreen();
void showNormal();
// void setDisabled (bool);
// void setEnabled (bool);
// void setWindowTitle (const QString &);
//virtual void setVisible (bool visible);
// void setStyleSheet (const QString & styleSheet);
// void setHidden (bool hidden);
// void setWindowModified(bool);
//inline void setFocus () { setFocus(Qt::OtherFocusReason); }
Q_SIGNALS:
//void windowTitleChanged (const QString & title);
//void windowIconChanged (const QIcon & icon);
//void windowIconTextChanged (const QString & iconText);
void customContextMenuRequested(const QPoint & pos);
public:
QStyle * style() const;
void setStyle(QStyle *);
QLayout * layout() const;
void setLayout(QLayout *);
QScreen * screen() const;
void setScreen(QScreen *);
WId winId() const;
inline WId internalWinId() const { return data->winid; }
WId effectiveWinId() const;
void createWinId(); // internal, going away
QString windowRole() const;
void setWindowRole(const QString &);
QPalette::ColorRole backgroundRole() const;
void setBackgroundRole(QPalette::ColorRole);
QPalette::ColorRole foregroundRole() const;
void setForegroundRole(QPalette::ColorRole);
QGraphicsEffect * graphicsEffect() const;
void setGraphicsEffect(QGraphicsEffect * effect);
QGraphicsProxyWidget * graphicsProxyWidget() const;
QRegion mask() const;
void setMask(const QBitmap &);
void setMask(const QRegion &);
void clearMask();
//enum Qt::WindowState { WindowMinimized, WindowMaximized, WindowFullScreen ... };
Qt::WindowStates windowState() const;
void setWindowState(Qt::WindowStates state);
void overrideWindowState(Qt::WindowStates state);
QMargins contentsMargins() const;
void setContentsMargins(int left, int top, int right, int bottom);
void setContentsMargins(const QMargins & margins);
inline bool testAttribute(Qt::WidgetAttribute) const;
void setAttribute(Qt::WidgetAttribute, bool on = true);
bool isAncestorOf(const QWidget * child) const;
void setParent (QWidget * parent);
void setParent (QWidget * parent, Qt::WindowFlags f);
QList<QAction *> actions() const;
void insertAction (QAction * before, QAction * action);
void insertActions(QAction * before, const QList<QAction *> & actions);
void addActions( const QList<QAction *> & actions);
void addAction ( QAction * action);
void removeAction ( QAction * action);
Q_INVOKABLE QPixmap grab(const QRect & rectangle = QRect(QPoint(0, 0),
QSize(-1, -1)));
void grabGesture(Qt::GestureType type,
Qt::GestureFlags flags = Qt::GestureFlags());
void ungrabGesture(Qt::GestureType type);
static QWidget * mouseGrabber (); //关于鼠标
void grabMouse();
void grabMouse(const QCursor &);
void releaseMouse();
static QWidget * keyboardGrabber (); //关于键盘
void grabKeyboard();
void releaseKeyboard();
int grabShortcut(const QKeySequence & key, //快捷键
Qt::ShortcutContext context = Qt::WindowShortcut);
void releaseShortcut(int id);
void setShortcutEnabled (int id, bool enable = true);
void setShortcutAutoRepeat(int id, bool enable = true);
bool underMouse () const;
inline bool isRightToLeft() const { return layoutDirection() == Qt::RightToLeft; }
inline bool isLeftToRight() const { return layoutDirection() == Qt::LeftToRight; }
bool isWindow() const;
QWidget * window() const;
QWindow * windowHandle() const;
QWidget * parentWidget() const;
QWidget * nativeParentWidget() const;
inline QWidget * topLevelWidget() const { return window(); }
QWidget * focusWidget() const;
QWidget * nextInFocusChain () const;
QWidget * previousInFocusChain () const;
static QWidget * find(WId);
inline QWidget * childAt(int x, int y) const;
QWidget * childAt(const QPoint & p) const;
static QWidget * createWindowContainer(QWindow * window,
QWidget * parent=nullptr,
Qt::WindowFlags flags = Qt::WindowFlags());
QPointF mapTo (const QWidget *, const QPointF &) const;
QPoint mapTo (const QWidget *, const QPoint &) const;
QPointF mapToGlobal(const QPointF &) const;
QPoint mapToGlobal(const QPoint &) const;
QPointF mapToParent(const QPointF &) const;
QPoint mapToParent(const QPoint &) const;
QPointF mapFrom (const QWidget *, const QPointF &) const;
QPoint mapFrom (const QWidget *, const QPoint &) const;
QPointF mapFromGlobal(const QPointF &) const;
QPoint mapFromGlobal(const QPoint &) const;
QPointF mapFromParent(const QPointF &) const;
QPoint mapFromParent(const QPoint &) const;
int devType() const override;
inline Qt::WindowType windowType() const;
QBackingStore * backingStore () const;
QPaintEngine * paintEngine () const override; //以下开始各种写函数
void activateWindow();
void stackUnder (QWidget *);
void adjustSize ();
void ensurePolished() const;
void scroll(int dx, int dy);
void scroll(int dx, int dy, const QRect &);
static void setTabOrder (QWidget *, QWidget *);
void setFixedSize (const QSize &);
void setFixedSize (int w, int h);
void setFixedWidth (int w);
void setFixedHeight(int h);
void render(QPaintDevice * target,
const QPoint & targetOffset = QPoint (),
const QRegion & sourceRegion = QRegion(),
RenderFlags renderFlags = RenderFlags(DrawWindowBackground | DrawChildren));
void render(QPainter * painter,
const QPoint & targetOffset = QPoint(),
const QRegion & sourceRegion = QRegion(),
RenderFlags renderFlags = RenderFlags(DrawWindowBackground | DrawChildren));
protected: // Event handlers
bool event(QEvent * event) override;
virtual void mousePressEvent(QMouseEvent * event);
virtual void mouseReleaseEvent(QMouseEvent * event);
virtual void mouseDoubleClickEvent(QMouseEvent * event);
virtual void mouseMoveEvent(QMouseEvent * event);
virtual void wheelEvent(QWheelEvent * event);
virtual void keyPressEvent(QKeyEvent * event);
virtual void keyReleaseEvent(QKeyEvent * event);
virtual void focusInEvent(QFocusEvent * event);
virtual void focusOutEvent(QFocusEvent * event);
virtual void enterEvent(QEnterEvent * event);
virtual void leaveEvent(QEvent * event);
virtual void paintEvent(QPaintEvent * event);
virtual void moveEvent(QMoveEvent * event);
virtual void resizeEvent(QResizeEvent * event);
virtual void closeEvent(QCloseEvent * event);
virtual void contextMenuEvent(QContextMenuEvent * event);
virtual void tabletEvent(QTabletEvent * event);
virtual void actionEvent(QActionEvent * event);
virtual void dragEnterEvent(QDragEnterEvent * event);
virtual void dragMoveEvent(QDragMoveEvent * event);
virtual void dragLeaveEvent(QDragLeaveEvent * event);
virtual void dropEvent(QDropEvent * event);
virtual void showEvent(QShowEvent * event);
virtual void hideEvent(QHideEvent * event);
virtual void changeEvent(QEvent * );
virtual bool nativeEvent(const QByteArray & eventType, void * message,
qintptr * result);
virtual void inputMethodEvent(QInputMethodEvent * );
public:
virtual QVariant inputMethodQuery(Qt::InputMethodQuery) const;
protected:
friend class QDataWidgetMapperPrivate; // for access to focusNextPrevChild
virtual bool focusNextPrevChild(bool next);
inline bool focusNextChild() { return focusNextPrevChild(true ); }
inline bool focusPreviousChild() { return focusNextPrevChild(false); }
int metric (PaintDeviceMetric) const override;
QPaintDevice * redirected (QPoint * offset) const override;
QPainter * sharedPainter() const override;
}; //完结 class QWidget : public QObject, public QPaintDevice
Q_DECLARE_OPERATORS_FOR_FLAGS(QWidget::RenderFlags)
QT_END_NAMESPACE
#endif // QWIDGET_H
(3)补充本类里关于尺寸坐标大小方面的属性知识 :
class QWidget : public QObject
{
//This property holds the geometry of the widget relative to its parent and
// excluding the window frame When changing the geometry。
//此属性表示小部件相对于其父级和排除窗口框架的几何形状。
//在更改几何形状时,该小部件(如果可见)会立即接收到一个移动事件(moveEvent()),
// 和/或一个缩放事件(resizeEvent())。
//如果该小部件当前不可见,那么在显示之前它必定会接收到相应的事件。
//如果大小组件位于由minimumSize()和maximumSize()定义的范围之外,则会进行调整。
//警告:在resizeEvent()或moveEvent()中调用setGeometry()可能会导致无限递归。
//默认情况下,此属性包含一个取决于用户平台和屏幕几何形状的值。
//class QRect { int x1; int y1; int x2; int y2; };
Q_PROPERTY(QRect geometry
READ geometry WRITE setGeometry)
Q_PROPERTY(QRect frameGeometry READ frameGeometry) //包含边框
//geometry of the widget relative to its parent including any window frame。
Q_PROPERTY(QRect normalGeometry READ normalGeometry)
//此属性保存了当作为正常(未最大化或全屏)顶级窗口显示时的控件几何形状。
//如果小部件已经处于此状态,则正常几何将反映小部件当前的geometry()。
//对于子小部件,此属性始终保持一个空矩形。默认情况下,此属性包含一个空矩形。
Q_PROPERTY(QRect rect READ rect)
//This property holds the
// internal geometry of the widget excluding any window frame。
//The rect property equals QRect(0, 0, width(), height()).
//此属性包含小部件的内部几何形状,不包括任何窗口框架。
//rect 属性等于 QRect(0,0,宽度(),高度()。
//class QRect { int x1; int y1; int x2; int y2; };
//This property holds the bounding rectangle of the widget's children,
//Hidden children are excluded.
//此属性持有小部件子元素的边界矩形。 隐藏的子项被排除在外。
//默认情况下,对于没有子项的控件,此属性包含一个位于原点处、宽度和高度均为零的矩形。
Q_PROPERTY(QRect childrenRect READ childrenRect)
Q_PROPERTY(QRegion childrenRegion READ childrenRegion)
//class QRegion { struct QRegionData * d; };
//此属性持有小部件子元素所占据的组合区域。 隐藏的子项被排除在外。
//默认情况下,对于没有子项的控件,此属性包含一个空区域。
//This property holds the size of the widget including any window frame。
//此属性表示包含任何窗口框架的组件大小。 class QSize { int wd; int ht; };
Q_PROPERTY(QSize frameSize READ frameSize)
Q_PROPERTY(QSize size //不包含本组件的边框
READ size WRITE resize
DESIGNABLE false STORED false)
//This property holds the size of the widget excluding any window frame。
//此属性表示不包括任何窗口框架的控件大小。
//如果该小部件在调整大小时被可见,它将立即接收到一个调整大小事件(resizeEvent())。
//如果该小部件当前不可见,那么在显示之前它必定会接收到一个事件。
//如果大小超出由minimumSize()和maximumSize()定义的范围,则会调整其大小。
//默认情况下,此属性包含一个依赖于用户平台和屏幕几何形状的值。
// ! 警告:在resizeEvent()中调用resize()或setGeometry()可能会导致无限递归。
//注意:将大小设置为QSize(0,0)会导致小部件在屏幕上不显示。这同样适用于窗口。
Q_PROPERTY(QSize sizeHint READ sizeHint)
//这个属性持有小部件的尺寸增量。当用户调整窗口大小时,大小将以
//sizelncrement().width()像素的水平增量和sizelncrement()height()像素的垂直增量移动,
//以 baseSize()为基础。首选小部件大小是非负整数i和 j。
//请注意,虽然您可以设置所有小部件的大小增量,但它只影响窗口。
//默认情况下,此属性包含宽度为0、高度为0的尺寸。
//警告:在 Windows 下,大小增量没有影响,X11的窗口管理器可能会忽略它。
//机器翻译时,总把 Widget 翻译成小部件,把 window 翻译成窗口。这可能不大准确。
Q_PROPERTY(QSize sizeIncrement
READ sizeIncrement
WRITE setSizeIncrement)
Q_PROPERTY(QSize baseSize
READ baseSize WRITE setBaseSize)
//此属性表示小部件的基本大小。
//基底尺寸用于计算合适的组件大小,如果组件定义了sizelncrement()。
//默认情况下,对于新创建的控件,此属性包含一个宽度和高度均为零的尺寸。
//此属性表示不包括任何窗口框架的组件宽度。
//This property holds the width of the widget excluding any window frame。
Q_PROPERTY(int width READ width)
Q_PROPERTY(int height READ height)
//This property holds the height of the widget excluding any window frame.
//此属性表示不包括任何窗口框架的组件高度。
//默认情况下,此属性包含一个取决于用户平台和屏幕几何形状的值。
//此属性表示小部件相对于其父级(包括任何窗口框架)的x坐标。默认情况下,此属性的值为0。
Q_PROPERTY(int x READ x)
Q_PROPERTY(int y READ y) //坐标信息包含自己的边框
//This property holds the y coordinate of the
// widget relative to its parent and including any window frame.
Q_PROPERTY(QPoint pos //包含本组件的边框后的坐标。
READ pos WRITE move
DESIGNABLE false STORED false)
//此属性表示小部件在其父小部件中的位置。
//如果小部件是窗口,其位置是指小部件在桌面上的位置,包括其框架。
//在改变位置时,如果该小部件可见,它将立即接收到移动事件(moveEvent())。
//如果该小部件当前不可见,那么在显示之前它必定会接收到一个事件。
//默认情况下,此属性包含一个引用原点的位置。
//警告:在moveEvent()中调用move()或setGeometry()可能会导致无限递归。
}
++测试一下,先拿标签来测试 :
++
++
++测试结果 ;
(4)换成 QFrame 这一正宗的带边框容器,测试一下 :
++ 测试代码 :
void MainWindow::on_pushButton_2_clicked()
{
qDebug() << "------以下是带标题栏的窗体数据------------";
qDebug() << "x () :" << x();
qDebug() << "y () :" << y();
qDebug() << "pos () :" << pos();
qDebug() << "width () :" << width();
qDebug() << "height() :" << height();
qDebug() << "****************************";
qDebug() << " size() :" << size();
qDebug() << "frameSize() :" << frameSize();
qDebug() << " baseSize() :" << baseSize();
qDebug() << "sizeIncrement() :" << sizeIncrement();
qDebug() << "sizeHint() :" << sizeHint();
qDebug() << "****************************";
qDebug() << " rect() :" << rect();
qDebug() << "childrenRect() :" << childrenRect();
qDebug() << "childrenRegion() :" << childrenRegion();
qDebug() << "****************************";
qDebug() << " geometry() :" << geometry();
qDebug() << " frameGeometry() :" << frameGeometry();
qDebug() << "normalGeometry() :" << normalGeometry();
qDebug() << "-------以下是外部 QFrame----------";
qDebug() << "x () :" << ui->frame->x();
qDebug() << "y () :" << ui->frame->y();
qDebug() << "pos () :" << ui->frame->pos();
qDebug() << "width () :" << ui->frame->width();
qDebug() << "height() :" << ui->frame->height();
qDebug() << "****************************";
qDebug() << " size() :" << ui->frame->size();
qDebug() << "frameSize() :" << ui->frame->frameSize();
qDebug() << " baseSize() :" << ui->frame->baseSize();
qDebug() << "sizeIncrement() :" << ui->frame->sizeIncrement();
qDebug() << "sizeHint() :" << ui->frame->sizeHint();
qDebug() << "****************************";
qDebug() << " rect() :" << ui->frame->rect();
qDebug() << "childrenRect() :" << ui->frame->childrenRect();
qDebug() << "childrenRegion() :" << ui->frame->childrenRegion();
qDebug() << "****************************";
qDebug() << " geometry() :" << ui->frame->geometry();
qDebug() << " frameGeometry() :" << ui->frame->frameGeometry();
qDebug() << "normalGeometry() :" << ui->frame->normalGeometry();
qDebug() << "-------以下是内部 QFrame-----------";
qDebug() << "x () :" << ui->frame_2->x();
qDebug() << "y () :" << ui->frame_2->y();
qDebug() << "pos () :" << ui->frame_2->pos();
qDebug() << "width () :" << ui->frame_2->width();
qDebug() << "height() :" << ui->frame_2->height();
qDebug() << "****************************";
qDebug() << " size() :" << ui->frame_2->size();
qDebug() << "frameSize() :" << ui->frame_2->frameSize();
qDebug() << " baseSize() :" << ui->frame_2->baseSize();
qDebug() << "sizeIncrement() :" << ui->frame_2->sizeIncrement();
qDebug() << "sizeHint() :" << ui->frame_2->sizeHint();
qDebug() << "****************************";
qDebug() << " rect() :" << ui->frame_2->rect();
qDebug() << "childrenRect() :" << ui->frame_2->childrenRect();
qDebug() << "childrenRegion() :" << ui->frame_2->childrenRegion();
qDebug() << "****************************";
qDebug() << " geometry() :" << ui->frame_2->geometry();
qDebug() << " frameGeometry() :" << ui->frame_2->frameGeometry();
qDebug() << "normalGeometry() :" << ui->frame_2->normalGeometry();
qDebug() << "------以下是最里面的标签------------";
qDebug() << "x () :" << ui->label->x();
qDebug() << "y () :" << ui->label->y();
qDebug() << "pos () :" << ui->label->pos();
qDebug() << "width () :" << ui->label->width();
qDebug() << "height() :" << ui->label->height();
qDebug() << "****************************";
qDebug() << " size() :" << ui->label->size();
qDebug() << "frameSize() :" << ui->label->frameSize();
qDebug() << " baseSize() :" << ui->label->baseSize();
qDebug() << "sizeIncrement() :" << ui->label->sizeIncrement();
qDebug() << "sizeHint() :" << ui->label->sizeHint();
qDebug() << "****************************";
qDebug() << " rect() :" << ui->label->rect();
qDebug() << "childrenRect() :" << ui->label->childrenRect();
qDebug() << "childrenRegion() :" << ui->label->childrenRegion();
qDebug() << "****************************";
qDebug() << " geometry() :" << ui->label->geometry();
qDebug() << " frameGeometry() :" << ui->label->frameGeometry();
qDebug() << "normalGeometry() :" << ui->label->normalGeometry();
}
++ 测试结果如下, 一开始把程序窗体放在屏幕的左上角 :
++外 QFrame 容器的这些成员函数的计算取值结果:
++
++
++至此,以上这些测试,比较全面的了解了这些几何尺寸与坐标的成员函数的含义。
(5)
谢谢