qt之ui开发

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()

获取鼠标的坐标,该坐标所处的坐标系是屏幕左上角的全局坐标

相关推荐
syj_1111 小时前
初识ArkUI
ui·arkts·arkui
远歌已逝3 小时前
维护在线重做日志(二)
数据库·oracle
qq_433099404 小时前
Ubuntu20.04从零安装IsaacSim/IsaacLab
数据库
Dlwyz4 小时前
redis-击穿、穿透、雪崩
数据库·redis·缓存
工业甲酰苯胺6 小时前
Redis性能优化的18招
数据库·redis·性能优化
没书读了7 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
----云烟----7 小时前
QT中QString类的各种使用
开发语言·qt
i道i7 小时前
MySQL win安装 和 pymysql使用示例
数据库·mysql
小怪兽ysl7 小时前
【PostgreSQL使用pg_filedump工具解析数据文件以恢复数据】
数据库·postgresql
wqq_9922502778 小时前
springboot基于微信小程序的食堂预约点餐系统
数据库·微信小程序·小程序