QWidget类是所有用户界面对象的基类.
属性
- acceptDrops : bool - 窗口部件中拖拽事件是否有效,设置为true会向系统通知此窗口小部件可能能够接受放置事件
- accessibleDescription : QString - 控件说明(通过一些辅助技术工具才可见),默认为空。
- accessibleName : QString - 窗口部件名称(通过一些辅助技术工具才可见)
- autoFillBackground : bool - 窗口部件背景是否自动填充
- baseSize : QSize - 窗口部件的基本大小
- childrenRect : const QRect - 窗口部件的子对象的边界矩形,隐藏的子对象被排除在外。
- childrenRegion : const QRegion - 窗口部件的子对象所占用的组合区域,隐藏的子对象被排除在外。
- contextMenuPolicy : Qt::ContextMenuPolicy - 窗口部件如何显示上下文菜单
- cursor : QCursor - 窗口部件的光标外形
- enabled : bool - 窗口部件是否有效
- focus : const bool - 窗口部件(或者它的焦点代理)是否得到键盘输入焦点
- focusPolicy : Qt::FocusPolicy - 窗口部件接收键盘焦点的策略
- font : QFont - 窗口部件当前的字体集
- frameGeometry : const QRect - 窗口部件相对于其父级的几何形状,包括任何窗口框架
- frameSize : const QSize - 窗口部件的大小,包括任何窗口框架
- fullScreen : const bool - 窗口部件是否以全屏模式显示
- geometry : QRect - 窗口部件相对于其父窗口的几何图形,并排除窗口框架
- height : const int - 不包括窗口框架的窗口部件的高度
- inputMethodHints : Qt::InputMethodHints - 具体的输入方法提示小部件具有什么
- isActiveWindow : const bool - 窗口部件或者它的一个子对象是否是活动窗口
- layoutDirection : Qt::LayoutDirection - 窗口部件的布局方向
- locale : QLocale - 窗口部件的区域设置
- maximized : const bool - 窗口部件是否已最大化
- maximumHeight : int - 窗口部件的最大高度(以像素为单位)
- maximumSize : QSize - 窗口部部件的最大大小(以像素为单位)
- maximumWidth : int - 窗口部件的最大宽度(以像素为单位)
- minimized : const bool - 窗口部件是否最小化(图标化)
- minimumHeight : int - 窗口部件的最小高度(以像素为单位)
- minimumSize : QSize - 窗口部件的最小大小
- minimumSizeHint : const QSize - 建议的窗口部件最小大小
- minimumWidth : int - 窗口部件的最小宽度(以像素为单位)
- modal : const bool - 窗口部件是否为模式窗口
- mouseTracking : bool - 窗口部件跟踪鼠标是否生效
- normalGeometry : const QRect - 窗口部件的几何图形,因为它在显示为普通(非最大化或全屏)顶级窗口部件时将显示
- palette : QPalette - 窗口部件的调色板
- pos : QPoint - 窗口部件在它的父窗口部件中的位置
- rect : const QRect - 不包含任何窗口框架的窗口部件的内部几何形状
- size : QSize - 不包含任何窗口框架的窗口部件的大小
- sizeHint : const QSize - 建议的窗口部件大小
- sizeIncrement : QSize - 窗口部件的大小增量
- sizePolicy : QSizePolicy - 窗口部件的默认布局行为
- statusTip : QString - 窗口部件的状态提示
- styleSheet : QString - 窗口部件的样式表
- tabletTracking : bool - 窗口部件是否启用了平板电脑跟踪
- toolTip : QString - 窗口部件的工具提示
- toolTipDuration : int - 窗口部件的工具提示持续时间(以毫秒为单位)。如果值为-1(默认值),则根据工具提示的长度计算持续时间。
- updatesEnabled : bool - 更新是否生效
- visible : bool - 窗口部件是否可视
- whatsThis : QString - 窗口部件的“这是什么”帮助文本
- width : const int - 不包含任何窗口框架的窗口部件宽度
- windowFilePath : QString - 窗口部件关联的文件路径
- windowFlags : Qt::WindowFlags - 窗口标志
- windowIcon : QIcon - 窗口部件的图标
- windowModality : Qt::WindowModality - 哪个窗口被模态部件阻塞
- windowModified : bool - 窗口中显示的文档是否有未保存的更改
- windowOpacity : double - 窗口的不透明度级别
- windowTitle : QString - 窗口标题
- x : const int - 窗口部件相对于其父窗口的x坐标,包括任何窗口框架
- y : const int - 窗口部件相对于其父窗口的y坐标,并包括任何窗口框架
公共函数
bool | acceptDrops() const |
void | setAcceptDrops(bool on) |
设置窗体是否支持拖拽属性。声明dragEnterEvent和dropEvent事件函数,对窗口的拖拽行为进行处理。
QString | accessibleDescription() const |
void | setAccessibleDescription(const QString &description) |
控件的说明描述(通过一些辅助技术工具才可见),默认为空。
QString | accessibleName() const |
void | setAccessibleName(const QString &name) |
控件名称,默认为空。
PS: 作者只正确实现函数调用逻辑,但未真正验证其函数的功能,通过网上搜索得知 accessibleDescription 和 accessibleName 皆是为了方便一些需要通过辅助浏览工具(如TalkBack)的人正常使用应用程序功能。
bool | autoFillBackground() const |
void | setAutoFillBackground(bool enabled) |
这个属性决定QWidget的背景色是否自动填充,默认是false。如果bool为true,这个属性会在QWidget触发PaintEvent之前引起Qt填充QWidget的背景色,填充的颜色是由widget的QPalette::window颜色角色所决定的,如果bool为false,QWidget会使用从父类传递来的“默认”背景色。网上也有说法setAutoFillBackground可以解释为QWidget是否从父窗体继承背景色。
如果该widget没有设置WA_OpaquePaintEvent属性或者WA_NoSystemBackground属性,windows总是会使用QPalette::window颜色角色。
如果widget的父窗口有渐变的背景色填充,那么这个属性是不能设置为false。
混合使用此属性和Qt style sheet的时候需要注意,当一个widget拥有一个style sheet设置的背景色或者border-image,那么autoFillBackground属性自动关闭。
QSize | baseSize() const |
void | setBaseSize(const QSize &) |
void | setBaseSize(int basew, int baseh) |
设置窗体的基本大小。
Qt::ContextMenuPolicy | contextMenuPolicy() const |
void | setContextMenuPolicy(Qt::ContextMenuPolicy policy) |
其设置枚举类型有Qt::DefaultContextMenu,Qt::ActionsContextMenu, Qt::CustomContextMenu,Qt::NoContextMenu,Qt::PreventContextMenu。
Qt::DefaultContextMenu是默认值,利用右键菜单事件contextMenuEvent( QContextMenuEvent * event )函数做处理。
使用Qt::CustomContextMenu时,会触发customContextMenuRequested ( const QPoint & pos )信号,仅仅只是发信号,所以需要自己写显示右键菜单的slot。
Qt::ActionsContextMenu会把部件的所有action即QWidget::actions()作为context menu显示出来
Qt::NoContextMenu,Qt::PreventContextMenu不显示上下文菜单。
QCursor | cursor() const |
void | setCursor(const QCursor &) |
void | unsetCursor() |
设置控件内光标形状,当鼠标经过这个小部件时,鼠标光标将会呈现设定的形状。光标形状查看Qt::CursorShape 。
如果光标离开小部件,即使抓住鼠标,一些底层窗口实现也会重置光标。如果要为所有窗口小部件设置游标,或在窗口外,请考虑使用QApplication :: setOverrideCursor函数。
bool | isEnabled() const |
void | setEnabled(bool) |
设置控件是否启用或禁用。
Qt::FocusPolicy | focusPolicy() const |
void | setFocusPolicy(Qt::FocusPolicy policy) |
设置控件接受键盘焦点方式。如果控件需要处理键盘事件,则必须为窗口控件启用键盘焦点。焦点策略查看Qt :: FocusPolicy。
focusInEvent()接受窗口控件的收到键盘焦点事件
focusOutEvent()接受窗口控件的丢失键盘焦点事件。
focusNextChild()将焦点传递到序列下一个窗口控件,适用于Tab方式。成功返回true,否则返回false.
focusPreviousChild() 将焦点切换到前一个窗口控件,适用于Shift + Tab。
focusNextPrevChild(bool) 将焦点切换到新的窗口控件,适用于Tab和Shift + Tab。如果传参为true,则函数向前搜索,如果传参为false, 则向后搜索。
#pragma once
#include <QtWidgets/QWidget>
#include <QtGui>
#include <QMenu>
#include "ui_QtWidget.h"
class QtWidget : public QWidget
{
Q_OBJECT
public:
QtWidget(QWidget *parent = Q_NULLPTR);
protected:
void dragEnterEvent(QDragEnterEvent *event);
void dragLeaveEvent(QDragLeaveEvent *event);
void dragMoveEvent(QDragMoveEvent *event);
void dropEvent(QDropEvent *event);
public slots:
void onActions();
void onContext(const QPoint& ps);
void onPushButtonClick();
void onPushButton2Click();
private:
Ui::QtWidgetClass ui;
};
#include "QtWidget.h"
QtWidget::QtWidget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
bool isDrops = this->acceptDrops();
isDrops = true;
this->setAcceptDrops(isDrops);
QString desc = this->accessibleDescription();
this->setAccessibleDescription(QString::fromLocal8Bit("一个用来理解QWidget属性的应用程序。"));
QString name = this->accessibleName();
this->setAccessibleName(QString::fromLocal8Bit("QWidget属性应用程序。"));
this->setAutoFillBackground(true);
bool isFill = this->autoFillBackground();
QPalette p;
p.setBrush(this->backgroundRole(), QBrush(QColor(51, 51, 51)));
this->setPalette(p);
this->setContextMenuPolicy(Qt::ActionsContextMenu);
{
QAction *a1 = new QAction("Action1", this);
QAction *a2 = new QAction("Action2", this);
connect(a1, SIGNAL(triggered(bool)), this, SLOT(onActions()));
connect(a2, SIGNAL(triggered(bool)), this, SLOT(onActions()));
this->addAction(a1);
this->addAction(a2);
}
this->setContextMenuPolicy(Qt::CustomContextMenu);
connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(onContext(const QPoint&)));//
connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(onPushButtonClick()));
connect(ui.pushButton_2, SIGNAL(clicked()), this, SLOT(onPushButton2Click()));
this->setCursor(Qt::CrossCursor);
this->setFocusPolicy(Qt::StrongFocus);
}
void QtWidget::onPushButtonClick()
{
bool result = this->focusNextChild();
}
void QtWidget::onPushButton2Click()
{
bool result = this->focusPreviousChild();
}
void QtWidget::onActions()
{
QAction* ac = qobject_cast<QAction*>(sender());
if (!ac) return;
qDebug() << ac->text().toStdString().c_str();
}
void QtWidget::onContext(const QPoint& ps)
{
QMenu *menu2 = new QMenu(this);
QAction * _qa1 = menu2->addAction(QString::fromLocal8Bit("--子项1"));
menu2->exec(QCursor::pos());
}
/* 当拖动正在进行时,这个事件处理器会被调用,而鼠标进入这个控件。*/
void QtWidget::dragEnterEvent(QDragEnterEvent *event)
{
// 判断拖拽文件类型
if (event->mimeData()->hasFormat("text/uri-list"))
{
event->acceptProposedAction(); //接受该动作
}
else
{
event->ignore(); //忽略或不处理后,将不会接受到后续的dragMoveEvent事件和dragLeaveEvent事件
}
}
/*当一个拖动正在进行中,鼠标离开这个控件时,它会被调用*/
void QtWidget::dragLeaveEvent(QDragLeaveEvent *event)
{
}
/*当一个拖动正在进行中,光标进入这个控件,光标在这个控件中移动,这个事件处理程序就会被调用*/
void QtWidget::dragMoveEvent(QDragMoveEvent *event)
{
QPoint point = event->pos(); //鼠标位置
}
/* 拖拽到这个控件中,释放鼠标处理函数 */
void QtWidget::dropEvent(QDropEvent *event)
{
QList<QUrl> urls = event->mimeData()->urls();
if (urls.isEmpty())
{
return;
}
QString fileName = urls.first().toLocalFile();
if (fileName.isEmpty())
{
return;
}
}