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

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

相关推荐
qingy_20464 分钟前
【JavaWeb】JavaWeb入门之XML详解
数据库·oracle
大数据面试宝典8 分钟前
用AI来写SQL:让ChatGPT成为你的数据库助手
数据库·人工智能·chatgpt
努力的小雨13 分钟前
快速上手 KSQL:轻松与数据库交互的利器
数据库·经验分享
Gentle58615 分钟前
labview中连接sql server数据库查询语句
数据库·labview
Gentle58616 分钟前
labview用sql server数据库存取数据到一个单元格
数据库·labview
2401_8576363919 分钟前
共享汽车管理新纪元:SpringBoot框架应用
数据库·spring boot·汽车
菲兹园长19 分钟前
表的设计(MYSQL)
数据库·mysql
Java Fans35 分钟前
MySQL数据库常用命令大全(完整版——表格形式)
数据库·mysql
起飞的风筝1 小时前
【redis】—— 环境搭建教程
数据库·redis·缓存
白萝卜弟弟1 小时前
【MySQL】MySQL函数之JSON_EXTRACT
数据库·mysql·json