一、四个重要概念
布局管理器、信号与槽、模态、半模态和非模态对话框。
二、学习示例代码时遇到的不熟悉的点
1.QPushButton构造函数
QPushButton是Qt框架中用于创建按钮的组件类,它是QWidget的子类。QPushButton构造函数的定义如下:
QPushButton(QWidget *parent = nullptr, const QString &text = QString())
在这个构造函数中,第一个参数parent
指向父窗口,如果这个参数为0,则该按钮就成为一个顶级窗口。第二个参数text
则是设置按钮上显示的文本内容。
2.QHBoxLayout的构造函数
QHBoxLayout的构造函数有以下几种形式:
1. QHBoxLayout():默认构造函数,创建一个水平布局。
2. QHBoxLayout(QWidget *parent):带有父窗口的构造函数,创建一个水平布局。
3. QHBoxLayout(int margin, QWidget *parent = nullptr):带有边距和父窗口的构造函数,创建一个水平布局。margin参数表示边距大小。
4. QHBoxLayout(int arg, Qt::Alignment alignment, QWidget *parent = nullptr):带有对齐方式和父窗口的构造函数,创建一个水平布局。arg参数表示对齐方式,alignment参数表示对齐方式的具体设置。
Qt::Alignment alignment可以取以下值:
- Qt::AlignLeft:左对齐
- Qt::AlignRight:右对齐
- Qt::AlignTop:顶部对齐
- Qt::AlignBottom:底部对齐
- Qt::AlignCenter:居中对齐
- Qt::AlignJustify:两端对齐(默认)
enum Qt::Alignment { Qt::AlignLeft = 0x0001, // 左对齐 Qt::AlignRight = 0x0002, // 右对齐 Qt::AlignTop = 0x0004, // 顶部对齐 Qt::AlignBottom = 0x0008, // 底部对齐 Qt::AlignCenter = 0x0010, // 居中对齐 Qt::AlignJustify = 0x0020 // 两端对齐(默认) };
5. QHBoxLayout(const QLayout *other, QWidget *parent = nullptr):拷贝构造函数,创建一个与另一个布局相同的水平布局。other参数表示被拷贝的布局对象。
3.QBoxLayout类的声明
不完整,目前先了解public访问类型的。
#include <QLayout>
class QBoxLayout : public QLayout
{
Q_OBJECT
public:
enum BoxDirection { TopToBottom, LeftToRight, RightToLeft, BottomToTop };
explicit QBoxLayout(QWidget *parent = nullptr);
explicit QBoxLayout(BoxDirection direction, QWidget *parent = nullptr);
void addItem(QLayoutItem *item) override;
void addWidget(QWidget *widget, int stretch = 0) override;
QSize sizeHint() const override;
void setGeometry(const QRect &rect) override;
protected:
void invalidate();
bool hasHeightForWidth() const override;
int heightForWidth(int w) const override;
int doLayout(QRect rect, bool testOnly) const override;
int count() const override;
QLayoutItem *itemAt(int index) const override;
Qt::Orientation orientation() const override;
private:
QVector<QLayoutItem *> itemList;
BoxDirection direction;
};
3.setSizePolicy()
setSizePolicy是Qt框架中的一个函数,主要用于设置部件(widget)在布局中的调整行为和约束条件,以便在窗口大小发生变化时自动调整。具体来说,这个函数用于指定部件在布局中的最小、最大和预期大小等参数。
在Qt中,对于widget的大小策略设置,不能直接调用setSizePolicy()函数,而是需要先后调用setHorizontalPolicy()和setVerticalPolicy()来分别设定其在水平和垂直方向上的策略。例如:
QSizePolicy sizePolicy = this->sizePolicy();
//this->sizePolicy() 是一个成员函数调用,它返回当前对象的尺寸策略。
//然后,将返回的策略赋值给 sizePolicy 变量,以便后续使用或修改该策略。
sizePolicy.setHorizontalPolicy(QSizePolicy::Minimum);
sizePolicy.setVerticalPolicy(QSizePolicy::Maximum);
4.QSpacerItem的构造函数
QSpacerItem(int w, int h, QSizePolicy::Policy hPolicy = QSizePolicy::Minimum, QSizePolicy::Policy vPolicy = QSizePolicy::Minimum)
附:
有些遗忘了的概念。
1.new 的用法
它的作用是在堆上创建一个新的对象,并返回指向该对象的指针。
int *p = new int; // 创建一个整型指针 p,并为其分配内存
*p = 10; // 将指针 p 所指向的内存中的值设置为 10
delete p; // 释放指针 p 所指向的内存
2.explicit
explicit是C++中的一个关键字,表示构造函数或转换函数不能被隐式调用。
class MyClass {
public:
explicit MyClass(int x) {}
};
MyClass obj = 10; // 错误,不能通过隐式类型转换来调用构造函数
MyClass obj2(10); // 正确,需要显式地调用构造函数
3.转换函数
转换函数(Conversion Function)是C++中一种特殊的成员函数,用于将一个类的对象转换为其他类型的对象。转换函数通常定义为类的成员函数,其返回值类型为目标类型,并且没有参数列表。
例如,假设有一个名为MyClass的类,它包含一个int类型的私有成员变量x,我们可以定义一个转换函数将其转换为int类型:
class MyClass {
private:
int x;
public:
MyClass(int x) : x(x) {} //构造函数
operator int() const { return x; } // 转换函数
};
在这个例子中,我们定义了一个名为operator int()的转换函数,它将MyClass对象转换为int类型。这个转换函数可以被隐式调用,例如:
MyClass obj(10);
int y = obj; // 隐式调用转换函数,将obj转换为int类型
需要注意的是,如果一个类中定义了多个转换函数,只有最匹配的转换函数才会被调用。例如:
class MyClass {
private:
int x;
public:
MyClass(int x) : x(x) {}
operator int() const { return x; } // 转换函数1
operator double() const { return static_cast<double>(x); } // 转换函数2
};
在这个例子中,如果我们尝试将MyClass对象转换为double类型,只有转换函数2会被调用:
MyClass obj(10);
double z = obj; // 调用转换函数2,将obj转换为double类型