QWidget成员函数功能和使用详细说明(四)(文字+用例+代码+效果图)
通过简洁的用例代码、用例运行效果动图、详细注释说明QWidget类的各个成员函数包括信号、槽函数的功能和调用方法
文章目录
- 1.测试工程配置
- 2.成员函数
-
- 2.1 void setParent(QWidget *parent)
- 2.2 void setMouseTracking(bool enable)
- 2.3 bool hasMouseTracking() const
- 2.4 void setPalette(const QPalette &)
- 2.5 const QPalette &palette() const
- 2.6 int QWidget::grabShortcut(const QKeySequence &key, Qt::ShortcutContext context = Qt::WindowShortcut)
- 2.7 void setSizeIncrement(const QSize &)
- 2.8 void setSizePolicy(QSizePolicy)
- 2.9 QSizePolicy sizePolicy() const
- 2.10 void setSizePolicy(QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical)
- 2.11 void setUpdatesEnabled(bool enable)
- 2.12 bool updatesEnabled() const
- 2.13 void setWindowFilePath(const QString &filePath)
- 2.14 void setWindowFlags(Qt::WindowFlags type)
- 2.15 void setWindowIcon(const QIcon &icon)
- 2.16 void setWindowModality(Qt::WindowModality windowModality)
- 2.17 Qt::WindowModality windowModality() const
- 2.18 void setWindowOpacity(qreal level)
1.测试工程配置
创建名为QtGuiAppTest的qwidget工程,带ui文件
2.成员函数
继承自QObject和QPaintDevice。QObject详见QObject各成员函数功能详细说明(文字+用例+代码+效果图)
2.1 void setParent(QWidget *parent)
给当前控件设置父控件,当前控件会移动到新的parent的(0,0)位置
2.2 void setMouseTracking(bool enable)
(1)功能说明
属性mouseTracking : bool用于设置控件的鼠标跟踪是否启用
如果鼠标跟踪不启用,则仅当鼠标按住左键并移动时控件才能接收到鼠标移动事件
如果鼠标跟踪开启,则不需要鼠标按下,只要鼠标移动就能获取到鼠标移动事件
(2)效果展示
(3)调用程序
QtGuiAppTest.ui
QtGuiAppTest.h
#pragma once
#include <QtWidgets/QWidget>
#include "ui_QtGuiAppTest.h"
class QtGuiAppTest : public QWidget
{
Q_OBJECT
public:
QtGuiAppTest(QWidget *parent = Q_NULLPTR);
~QtGuiAppTest();
public slots:
void SlotTest(int checkStat);
protected:
void mouseMoveEvent(QMouseEvent* event)override;
private:
Ui::QtGuiAppTestClass ui;
};
QtGuiAppTest.cpp
#include "QtGuiAppTest.h"
#include<qevent.h>
QtGuiAppTest::QtGuiAppTest(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
connect(ui.checkBox, &QCheckBox::stateChanged, this, &QtGuiAppTest::SlotTest);
}
QtGuiAppTest::~QtGuiAppTest()
{
}
void QtGuiAppTest::SlotTest(int checkStat)
{
switch(checkStat)
{
case Qt::Unchecked:
this->setMouseTracking(false);
break;
case Qt::Checked:
this->setMouseTracking(true);
break;
default:
break;
}
}
void QtGuiAppTest::mouseMoveEvent(QMouseEvent* event)
{
int x = event->x();
int y = event->y();
QString str = QString("mouse pos: ( %1, %2 )").arg(x).arg(y);
ui.textBrowser->setText(str);
}
2.3 bool hasMouseTracking() const
判断是否设置了鼠标跟踪
2.4 void setPalette(const QPalette &)
(1)功能说明
属性palette : QPalette,存储了控件的调色板信息
该属性描述了控件的调色板。在渲染标准组件时,组件的样式使用调色板,并可用作确保自定义控件能够与本机平台的外观保持一致的手段。不同的平台或不同的风格具有不同的调色板是很常见的。
将新调色板分配给一个控件时,此调色板中的颜色角色将与控件的默认调色板组合在一起,形成控件的最终调色板。控件的背景角色的调色板条目用于填充控件的背景(请参阅 QWidget::autoFillBackground),前台角色(foreground role)用于初始化 QPainter 的笔。(即设置了前台颜色角色,则使用qpainter绘制时会渲染为前台颜色)
默认值取决于系统环境。QApplication 维护一个系统/主题调色板,该调色板作为所有控件的默认值。对于某些类型的控件,也可能有特殊的调色板默认值(例如,在 Windows Vista 上,所有派生自 QMenuBar 的类都有一个特殊的默认调色板)。您还可以通过将自定义调色板和控件名称传递给 QApplication::setPalette() 来自行定义控件的默认调色板。最后,样式始终可以在调色板设置之后进行润色(参见 QStyle::polish())。
QWidget 将显式调色板角色从父控件传播到子控件。如果将画笔或颜色分配给调色板上的特定角色,并将该调色板分配给一个控件,则该角色将传播到控件的所有子控件,并覆盖该控件的任何系统默认值。请注意,默认情况下,调色板不会传播到窗口(参见 isWindow()),除非启用了 Qt::WA_WindowPropagation 属性。
当前样式用于渲染所有标准Qt控件的内容,可以从控件调色板中自由选择颜色和画笔,或者在某些情况下,忽略调色板(部分或全部)。特别是,某些样式(如 GTK 样式、Mac 样式和 Windows Vista 样式)依赖于第三方 API 来呈现控件的内容,并且这些样式通常不遵循调色板。因此,将角色分配给控件的调色板并不能保证更改控件的外观。相反,您可以选择应用样式表。
(2)效果展示
部分子控件跟随父控件pallet变化颜色,且子控件设置自己的pallet是不起作用的
(3)调用程序
QtGuiAppTest.h
#pragma once
#include <QtWidgets/QWidget>
#include "ui_QtGuiAppTest.h"
class QtGuiAppTest : public QWidget
{
Q_OBJECT
public:
QtGuiAppTest(QWidget *parent = Q_NULLPTR);
~QtGuiAppTest();
public slots:
void SlotTest(int checkStat);
private:
Ui::QtGuiAppTestClass ui;
};
QtGuiAppTest.cpp
#include "QtGuiAppTest.h"
QtGuiAppTest::QtGuiAppTest(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
QPalette p(QColor(148, 233, 237));
this->setPalette(p);
connect(ui.pushButton, &QPushButton::clicked, this, &QtGuiAppTest::SlotTest);
}
QtGuiAppTest::~QtGuiAppTest()
{
}
void QtGuiAppTest::SlotTest(int checkStat)
{
QPalette p1(QColor(142, 237, 153));
this->setPalette(p1);
}
2.5 const QPalette &palette() const
获取当前控件的调色板
2.6 int QWidget::grabShortcut(const QKeySequence &key, Qt::ShortcutContext context = Qt::WindowShortcut)
(1)功能说明
向Qt的快捷键系统添加一个快捷键,用于在给定上下文中监视给定的键序列事件。如果上下文为 Qt::ApplicationShortcut,则快捷方式将应用于整个应用程序。否则,它要么是此控件 Qt::WidgetShortcut 的本地,要么是窗口本身 Qt::WindowShortcut。
(2)效果展示
(3)调用程序
QtGuiAppTest.ui
QtGuiAppTest.h
#include <QtWidgets/QWidget>
#include "ui_QtGuiAppTest.h"
class QtGuiAppTest : public QWidget
{
Q_OBJECT
public:
QtGuiAppTest(QWidget *parent = Q_NULLPTR);
~QtGuiAppTest();
protected:
bool event(QEvent* event) override;
private:
Ui::QtGuiAppTestClass ui;
};
QtGuiAppTest.cpp
#include "QtGuiAppTest.h"
#include<QShortcutEvent>
QtGuiAppTest::QtGuiAppTest(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
this->grabShortcut(QKeySequence(tr("Ctrl+P")));
}
QtGuiAppTest::~QtGuiAppTest()
{
}
bool QtGuiAppTest::event(QEvent* event)
{
if(event->type() == QEvent::Shortcut)
{
QShortcutEvent* psc = static_cast<QShortcutEvent*>(event);
ui.label->setText(psc->key().toString());
}
return QWidget::event(event);
}
2.7 void setSizeIncrement(const QSize &)
属性sizeIncrement : QSize包含控件的大小增量
当用户resize调整窗口大小的时候,窗口大小将会以sizeIncrement中的宽和高的值为步长、以baseSize()作为基础大小进行调整,大小计算如下:
width = baseSize().width() + i * sizeIncrement().width();
height = baseSize().height() + j * sizeIncrement().height();
其中i,j为resize的两个参数,指定宽调整的步数和高调整的步数
当为所有的控件指定大小增量( size increment),该增量仅影响窗口
默认,该增量的宽和高的值为0
警告:大小增量机制windows系统中没有作用,会被系统管理器忽略
2.8 void setSizePolicy(QSizePolicy)
(1)功能说明
属性sizePolicy : QSizePolicy存储控件的默认布局行为
在继承自QLayout的布局中,所有的子控件都有一个默认的布局策略(例如QHBoxLayout,所有放入的子组件大小都会调整为固定高度和拉伸填充为相等的宽度),但是有时候这种默认策略不是我们所需要的,如果需要将水平布局中三个控件中间一个控件宽度自适应拉伸填充而其他两个宽度不变这种非默认布局行为,则需要使用setSizePolicy给各个子控件设置对应的布局策略。
(2)效果展示
(3)调用程序
QtGuiAppTest.ui
QtGuiAppTest.h
#pragma once
#include <QtWidgets/QWidget>
#include "ui_QtGuiAppTest.h"
class QtGuiAppTest : public QWidget
{
Q_OBJECT
public:
QtGuiAppTest(QWidget *parent = Q_NULLPTR);
~QtGuiAppTest();
private:
Ui::QtGuiAppTestClass ui;
};
QtGuiAppTest.cpp
#include "QtGuiAppTest.h"
#include<qlayout.h>
#include<qpushbutton.h>
#include<qsizepolicy.h>
QtGuiAppTest::QtGuiAppTest(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
//创建布局行为策略,水平方向尺寸自动拉伸,垂直方向上尺寸固定,策略用于PushButton类型控件
QSizePolicy plcy1(QSizePolicy::Policy::Expanding, QSizePolicy::Policy::Fixed,
QSizePolicy::PushButton);
//创建布局行为策略,水平方向尺寸固定,垂直方向上自动拉伸,策略用于PushButto类型控件
QSizePolicy plcy2(QSizePolicy::Policy::Fixed, QSizePolicy::Policy::Expanding,
QSizePolicy::PushButton);
//创建布局行为策略,水平方向尺寸自适应最合适大小,垂直方向上自适应最合适大小,策略用于PushButto类型控件
QSizePolicy plcy3(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Preferred,
QSizePolicy::PushButton);
//创建布局行为策略,水平方向尺寸固定,垂直方向上尺寸固定,策略用于PushButto类型控件
QSizePolicy plcy4(QSizePolicy::Policy::Fixed, QSizePolicy::Policy::Fixed,
QSizePolicy::PushButton);
//创建栅格布局
QGridLayout* pGridLayout = new QGridLayout();
this->setLayout(pGridLayout);
//创建按钮并添加到栅格布局中
QPushButton* pbtn = new QPushButton("test1");
pGridLayout->addWidget(pbtn, 1, 1);
//给按钮添加布局行为策略
pbtn->setSizePolicy(plcy1);
pbtn = new QPushButton("test2");
pGridLayout->addWidget(pbtn, 1, 2);
pbtn->setSizePolicy(plcy2);
pbtn = new QPushButton("test3");
pGridLayout->addWidget(pbtn, 2, 1);
pbtn->setSizePolicy(plcy3);
pbtn = new QPushButton("test4");
pGridLayout->addWidget(pbtn, 2, 2);
pbtn->setSizePolicy(plcy4);
}
QtGuiAppTest::~QtGuiAppTest()
{
}
2.9 QSizePolicy sizePolicy() const
获取当前控件适用的布局行为策略
2.10 void setSizePolicy(QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical)
(1)功能说明
重载函数,与 void setSizePolicy(QSizePolicy)功能相同,见第8节
(2)效果展示
见2.8节
(3)调用程序
QtGuiAppTest::QtGuiAppTest(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
//创建栅格布局
QGridLayout* pGridLayout = new QGridLayout();
this->setLayout(pGridLayout);
//创建按钮并添加到栅格布局中
QPushButton* pbtn = new QPushButton("test1");
pGridLayout->addWidget(pbtn, 1, 1);
//给按钮添加尺寸策略,水平方向尺寸自动拉伸,垂直方向上尺寸固定
pbtn->setSizePolicy(QSizePolicy::Policy::Expanding, QSizePolicy::Policy::Fixed);
pbtn = new QPushButton("test2");
pGridLayout->addWidget(pbtn, 1, 2);
//给按钮添加尺寸策略,水平方向尺寸固定,垂直方向上自动拉伸
pbtn->setSizePolicy(QSizePolicy::Policy::Fixed, QSizePolicy::Policy::Expanding);
pbtn = new QPushButton("test3");
pGridLayout->addWidget(pbtn, 2, 1);
//给按钮添加尺寸策略,水平方向尺寸自适应最合适大小,垂直方向上自适应最合适大小
pbtn->setSizePolicy(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Preferred);
pbtn = new QPushButton("test4");
pGridLayout->addWidget(pbtn, 2, 2);
//给按钮添加尺寸策略,水平方向尺寸固定,垂直方向上尺寸固定
pbtn->setSizePolicy(QSizePolicy::Policy::Fixed, QSizePolicy::Policy::Fixed);
}
2.11 void setUpdatesEnabled(bool enable)
属性updatesEnabled : bool包含更新(updates)是否使能
一个更新使能的控件能够接收绘制事件(paint event)并具有系统背景;一个更新禁用控件则不能接收绘制事件和具有系统背景。如果更新被禁用,则对update()函数和repaint函数的调用都将没有效果
默认情况下,该属性值是true
setUpdatesEnabled()函数通常被用来短周期内禁用更新,例如避免在出现较大规模改动更新情况下出现屏幕闪烁(需要更新的事件长,频繁调用就会卡顿和闪烁)。在qt中,控件通常不会产生屏幕闪烁,但在X11上,当控件被隐藏时,服务器可能会擦除屏幕上的区域,然后才能被其他控件替换。禁用更新可以解决此问题。
例如:
setUpdatesEnabled(false);
bigVisualChanges();
setUpdatesEnabled(true);
禁用控件会隐式禁用其所有子控件。启用控件将启用所有子控件,但顶级控件或已显式禁用的控件除外。重新启用更新会在控件上隐式调用 update()。
2.12 bool updatesEnabled() const
获取当前控件更新使能状态
2.13 void setWindowFilePath(const QString &filePath)
(1)功能说明
属性windowFilePath : QString 保存一个与控件关联的文件路径。
该属性仅对窗口有作用。它将文件路径与窗口相关联。如果设置了文件路径,但尚未设置窗口标题,则Qt将窗口标题设置为指定路径的文件名,使用QFileInfo::fileName()获取。
如果在任何时候设置了窗口标题,则窗口标题优先,并且将显示而不是文件路径字符串。
如果没有设置路径,则属性包含一个空字符串
(2)效果展示
(3)调用程序
QtGuiAppTest.ui
QtGuiAppTest.h
#pragma once
#include <QtWidgets/QWidget>
#include "ui_QtGuiAppTest.h"
class QtGuiAppTest : public QWidget
{
Q_OBJECT
public:
QtGuiAppTest(QWidget *parent = Q_NULLPTR);
~QtGuiAppTest();
public slots:
void SlotTest();
private:
Ui::QtGuiAppTestClass ui;
};
QtGuiAppTest.cpp
#include "QtGuiAppTest.h"
QtGuiAppTest::QtGuiAppTest(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
this->setWindowTitle("");
this->setWindowFilePath("C: / Program Files / Microsoft Office");
connect(ui.pushButton, &QPushButton::clicked, this, &QtGuiAppTest::SlotTest);
}
QtGuiAppTest::~QtGuiAppTest()
{
}
void QtGuiAppTest::SlotTest()
{
ui.label->setText(this->windowFilePath());
}
2.14 void setWindowFlags(Qt::WindowFlags type)
给控件设置不同的窗口类型标识,根据标识控件显示为对应窗口的形式
2.15 void setWindowIcon(const QIcon &icon)
(1)功能说明
给控件添加图标
(2)效果展示
(3)调用程序
QtGuiAppTest.qrc
QtGuiAppTest.cpp
#include "QtGuiAppTest.h"
#include<qicon.h>
QtGuiAppTest::QtGuiAppTest(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
this->setWindowIcon(QIcon(QPixmap(":/Resources/paopao.png")));
}
2.16 void setWindowModality(Qt::WindowModality windowModality)
(1)功能说明
属性windowModality : Qt::WindowModality指定了哪些窗口会被模态影响
此属性仅对窗口有意义。模态窗口可防止其他窗口中的控件获取输入。此属性的值可以控制当控件可见时阻止哪些窗口获得输入。在窗口可见时更改此属性不起作用;必须先隐藏窗口(hide() ),然后再次显示它(show())。
属性为枚举类型,枚举值如下表
| 常量名 | 常量值 | 描述 |
|---|---|---|
| Qt::NonModal | 0 | 窗口不是模态,不阻止其他窗口的输入 |
| Qt::WindowModal | 1 | 该模态作用在单个窗口的层次结构上,阻止当前窗口的所有父窗口、祖窗口及各层的同级窗口输入 |
| Qt::ApplicationModal | 2 | 该模态作用在应用程序上(application),阻止窗口所在应用程序的所有其他窗口输入 |
(2)效果展示
(3)调用程序
QtGuiAppTest.ui
QtGuiAppTest.h
#pragma once
#include <QtWidgets/QWidget>
#include "ui_QtGuiAppTest.h"
class QtGuiAppTest : public QWidget
{
Q_OBJECT
public:
QtGuiAppTest(QWidget *parent = Q_NULLPTR);
~QtGuiAppTest();
public slots:
//控制打开测试窗口
void SlotTest();
//控制打开同级窗口
void SlotTest2();
//控制打开无关系窗口
void SlotTest3();
//切换模态配置
void SlotConf(int id);
private:
Ui::QtGuiAppTestClass ui;
//记录测试窗口
QDialog* m_pRecordWin;
//记录与测试窗口同级的窗口
QDialog* m_pOtherWin;
//记录不在测试窗口层级关系里的窗口
QDialog* m_pNoRelateWin;
};
QtGuiAppTest.cpp
#include "QtGuiAppTest.h"
#include<qdialog.h>
QtGuiAppTest::QtGuiAppTest(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
//创建三个窗口
m_pOtherWin = new QDialog(this);
m_pOtherWin->setWindowTitle(QString::fromLocal8Bit("同级子窗口"));
m_pOtherWin->resize(400, 100);
m_pNoRelateWin = new QDialog();
m_pNoRelateWin->resize(400, 100);
m_pNoRelateWin->setWindowTitle(QString::fromLocal8Bit("无关系窗口"));
m_pRecordWin = new QDialog(this);
m_pRecordWin->resize(300, 200);
connect(ui.pushButton, &QPushButton::clicked, this, &QtGuiAppTest::SlotTest);
connect(ui.pushButton_2, &QPushButton::clicked, this, &QtGuiAppTest::SlotTest2);
connect(ui.pushButton_3, &QPushButton::clicked, this, &QtGuiAppTest::SlotTest3);
connect(ui.comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
&QtGuiAppTest::SlotConf);
}
QtGuiAppTest::~QtGuiAppTest()
{
delete m_pNoRelateWin;
}
void QtGuiAppTest::SlotTest()
{
//判断如果窗口处于隐藏状态就显示,处于显示状态就隐藏
if(m_pRecordWin->isHidden())
{
m_pRecordWin->show();
}
else
{
m_pRecordWin->hide();
}
}
void QtGuiAppTest::SlotTest2()
{
m_pOtherWin->show();
}
void QtGuiAppTest::SlotTest3()
{
m_pNoRelateWin->show();
}
void QtGuiAppTest::SlotConf(int id)
{
//根据界面选择,给测试窗口设置不同的模态形式
switch(id)
{
case 0:
m_pRecordWin->setWindowModality(Qt::NonModal);
break;
case 1:
m_pRecordWin->setWindowModality(Qt::WindowModal);
break;
case 2:
m_pRecordWin->setWindowModality(Qt::ApplicationModal);
break;
default:
break;
}
}
2.17 Qt::WindowModality windowModality() const
获取当前控件的模态设置
2.18 void setWindowOpacity(qreal level)
(1)功能说明
属性windowOpacity : double 保留窗口的不透明度级别。
不透明度的有效范围从1(完全不透明)到0(完全透明)
该属性默认值为1
警告:将该属性值由完全不透明调整到透明可能会触发绘制事件(paint event),该绘制事件,需要在窗口展示之前处理。这个机制会对QPixmap::grabWindow()的使用产生影响。另请注意,半透明窗口的更新和调整大小比不透明窗口慢得多。
(2)效果展示
(3)调用程序
QtGuiAppTest.ui
QtGuiAppTest.h
#pragma once
#include <QtWidgets/QWidget>
#include "ui_QtGuiAppTest.h"
class QtGuiAppTest : public QWidget
{
Q_OBJECT
public:
QtGuiAppTest(QWidget *parent = Q_NULLPTR);
~QtGuiAppTest();
public slots:
void SlotTest(int level);
private:
Ui::QtGuiAppTestClass ui;
};
QtGuiAppTest.cpp
#include "QtGuiAppTest.h"
#include<qdialog.h>
QtGuiAppTest::QtGuiAppTest(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
qreal reallevel = 1 - ui.horizontalSlider->value() / 100.0;
ui.label_2->setText(QString("%1").arg(reallevel));
connect(ui.horizontalSlider, &QSlider::sliderMoved, this, &QtGuiAppTest::SlotTest);
}
QtGuiAppTest::~QtGuiAppTest()
{
}
void QtGuiAppTest::SlotTest(int level)
{
qreal reallevel = 1 - level / 100.0;
this->setWindowOpacity(reallevel);
ui.label_2->setText(QString("%1").arg(reallevel));
}
更多推荐


所有评论(0)