qt之ui开发
前言
在大型项目中用qt进行ui开发,通常直接通过控制对象进行开发,进行粒度更细的开发,而不是在.ui文件上做简单的拖拽
QWidget
qt的各种控件的祖宗,通常我们会继承自QWidget来进行,实现一个自己的窗口:
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
};
Widget::Widget(QWidget *parent)
: QWidget(parent)
{}
Widget::~Widget() {}
这个构造函数正在初始化一个继承自 QWidget 的 Widget 类。构造函数接收一个可选的父类 QWidget 作为参数,并将其传递给基类 QWidget 的构造函数
setWindowFlags();
setWindowFlags 函数可以设置多个窗口标志(Qt::WindowFlags),这些标志定义了窗口的外观和行为,可以通过按位或运算符(|)组合多个窗口标志,以获得所需的效果
this->setWindowFlags(Qt::FramelessWindowHint);//设置窗口无边框,这个widget将没有标题栏等
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);//无边框、置顶窗口
Qt::WindowFlags:
窗口类型:
- Qt::Window:表示一个独立的顶层窗口
- Qt::Popup:弹出窗口,例如右键菜单等。点击窗口外部时会自动关闭
窗口装饰: - Qt::WindowTitleHint:显示窗口标题栏。
- Qt::WindowSystemMenuHint:显示系统菜单(通常在窗口标题栏上,右键点击时弹出)。
- Qt::SplashScreen:启动画面窗口,显示在应用程序启动时
- Qt::FramelessWindowHint:无边框窗口,隐藏默认的标题栏和窗口边框
窗口行为: - Qt::WindowStaysOnTopHint:窗口始终保持在其他窗口之上
- Qt::WindowTransparentForInput:窗口不响应鼠标和键盘事件,类似于"点击穿透"效果
- Qt::WindowDoesNotAcceptFocus:窗口不会接收焦点
- Qt::MSWindowsOwnDC:指定窗口的绘制上下文(DC)应该由应用程序自己管理,而不是由窗口系统管理
setAttribute
用于设置窗口或控件的特定属性,setattribute只能一个个的设置,不能像windowflags一样用|设置多个标志位
Qt::WidgetAttribute:
外观与透明度:
- Qt::WA_TranslucentBackground:使窗口背景透明
输入控制: - Qt::WA_NoMouseReplay:禁止鼠标点击事件在控件之间重播
窗口行为 - Qt::WA_DeleteOnClose:当窗口关闭时,自动删除窗口对象
渲染与更新 - Qt::WA_PaintOnScreen:直接在屏幕上绘制控件,而不是通过窗口系统的缓冲区。这在某些情况下可以提升性能,尤其是全屏或大型窗口
子控件与父控件的行为 - Qt::WA_TransparentForMouseEvents:使控件对鼠标事件透明,即鼠标事件会传递到控件下层的控件中
- Qt::WA_NoChildEventsForParent:禁止父控件接收子控件的事件通知,这在子控件多的复杂窗口布局中有助于简化事件处理
setstylesheet
设置窗口或控件的样式
//可以对于窗口内的控件进行统一的样式设置,用#来选择到设置的objectName
this->setStyleSheet(
"#myButton { background-color: #3498db; color: white; }"
"#myButton:hover { background-color: #2980b9; }"
"#myButton:pressed { background-color: #1c5985; }"
);
//你可以通过类型选择器设置特定类型的控件样式,比如设置所有按钮的样式
this->setStyleSheet("QPushButton { background-color: #3498db; color: white; border-radius: 5px; }");
//仅对某个控件进行设置
QPushButton *button = new QPushButton(this);
button->setStyleSheet("background-color: #3498db; color: white;");
窗口的各种event
1.鼠标事件
- mousePressEvent(QMouseEvent *event):当鼠标按下时触发
- mouseReleaseEvent(QMouseEvent *event):当鼠标松开时触发
- mouseMoveEvent(QMouseEvent *event):当鼠标移动时触发
- mouseDoubleClickEvent(QMouseEvent *event):当鼠标双击时触发
重写示例:
void MyWidget::mousePressEvent(QMouseEvent *event) {
if (event->button() == Qt::LeftButton) {
qDebug() << "Left button clicked!";
}
//如果需要执行父窗口的点击事件响应
QWidget::mousePressEvent;
}
2.进入/离开事件
-
enterEvent(QEvent *event):当鼠标进入控件区域时触发
-
leaveEvent(QEvent *event):当鼠标离开控件区域时触发
void MyWidget::enterEvent(QEvent *event) {
qDebug() << "Mouse entered the widget!";
}
3.移动事件
- moveEvent(QMoveEvent *event):当控件被移动到屏幕的不同位置时触发
4.关闭事件
- closeEvent(QCloseEvent *event):当窗口或控件被关闭时触发
5.调整大小事件
- resizeEvent(QResizeEvent *event):当控件的大小发生变化时触发
6.绘制事件
- paintEvent(QPaintEvent *event):当控件需要重新绘制时(如窗口显示、大小调整)触发
QLabel
qt中的文本框,可以设置文字和图片,比较常用
-
设置文本内容
QLabel *label = new QLabel(this);
label->setText("Hello, QLabel!");
QString currentText = label->text(); -
设置图片
QPixmap pixmap(":/images/icon.png");
label->setPixmap(pixmap);
label->setScaledContents(true); // 图片将自动缩放 -
设置对齐方式
label->setAlignment(Qt::AlignCenter); // 居中对齐 -
设置文本字体
QFont font = label->font(); // 获取当前字体
font.setPointSize(16); // 设置字体大小为 16
label->setFont(font); // 应用字体 -
设置自动换行
label->setWordWrap(true); -
设置文本缩略
QFontMetrics metrics(label->font());
QString elidedText = metrics.elidedText("This is a very long text", Qt::ElideRight, 100);
label->setText(elidedText);
QPushButton
按钮控件
-
设置文本
QPushButton *button = new QPushButton(this);
button->setText("Click Me");
QString currentText = button->text(); -
设置按钮图标
button->setIcon(QIcon(":/icons/icon.png"));
button->setIconSize(QSize(32, 32)); // 设置图标大小为 32x32 -
设置按钮状态
button->setEnabled(false); // 禁用按钮
button->setCheckable(true); // 设置按钮为可切换状态
button->setChecked(true); // 设置为选中状态
bool isChecked = button->isChecked();
定时器
定时器默认是重复触发的,即给定一定的时间间隔,启动定时器后每隔一个时间间隔就会触发一次timeout
-
创建定时器
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &MyClass::onTimeout); -
设置单次触发
timer->setSingleShot(true); -
启动定时器
timer.start();
timer.start(5000);//以5s的时间间隔触发 -
设置触发间隔
timer->setInterval(5000);//以5s的时间间隔触发
QPainter
自定义控件或窗口的绘制
-
drawText():绘制文本。
painter.drawText(QPoint(10, 30), "Hello, World!");
painter.drawText(QRect(10, 10, 100, 30), Qt::AlignCenter, "Centered Text");
-
drawRect():绘制矩形。
painter.drawRect(10, 10, 80, 60); // x, y, width, height
-
drawEllipse():绘制椭圆或圆。
painter.drawEllipse(50, 50, 100, 100); // 绘制一个圆
-
drawLine():绘制直线。
painter.drawLine(QPoint(0, 0), QPoint(100, 100));
-
drawPixmap():绘制图片。
QPixmap pixmap(":/path/to/image.png");
painter.drawPixmap(20, 20, pixmap);
-
设置画笔 (QPen) 和画刷 (QBrush)
QPen 用于设置线条的属性
QBrush 用于设置填充区域的属性
QPen borderPen(QColor(0xFFFFFF)); // 边框颜色
borderPen.setWidth(2); // 边框宽度
painter->setPen(borderPen);
painter->setBrush(Qt::NoBrush);
qt中的坐标系
1.在 Qt 中,常见的坐标系有以下几种:
- 窗口坐标系 :以窗口的左上角为原点,控件的所有子控件的相对坐标都基于这个坐标系
- 屏幕坐标系 :以屏幕的左上角为原点,所有的控件和窗口都可以使用全局坐标来定位
- 父窗口坐标系:对于控件,父窗口的左上角是该控件的原点,控件的相对位置基于父窗口的坐标
2.常用位置计算函数
(1) move() 和 setGeometry()
- move(x, y):将控件移动到父窗口坐标系中的指定位置 (x, y)
- setGeometry(x, y, width, height):设置控件的矩形区域 (x, y, width, height),包含位置和大小,位置同样是父窗口坐标系的
(2) pos() 和 geometry()
- pos():返回控件在父窗口坐标系中的相对位置,返回值是 QPoint 类型
- geometry():返回控件的几何形状信息,包含控件的位置和大小,返回 QRect 类型
(3) mapToParent() 和 mapFromParent()
- mapToParent(const QPoint &point):将控件中的局部坐标 point 转换为父控件坐标系的坐标
- mapFromParent(const QPoint &point):将父控件中的坐标 point 转换为控件本地坐标系(也称局部坐标系,是以该控件的左上角为原点 (0, 0) 的坐标系)
(4) mapToGlobal() 和 mapFromGlobal()
- mapToGlobal(const QPoint &point):将控件的局部坐标 point 转换为屏幕全局坐标。
- mapFromGlobal(const QPoint &point):将全局屏幕坐标 point 转换为控件的局部坐标
(5)QPoint QCursor::pos()
获取鼠标的坐标,该坐标所处的坐标系是屏幕左上角的全局坐标