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

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

相关推荐
曹牧22 分钟前
Oracle数据库中,将JSON字符串转换为多行数据
数据库·oracle·json
被摘下的星星42 分钟前
MySQL count()函数的用法
数据库·mysql
末央&1 小时前
【天机论坛】项目环境搭建和数据库设计
java·数据库
徒 花1 小时前
数据库知识复习07
数据库·作业
素玥1 小时前
实训5 python连接mysql数据库
数据库·python·mysql
jnrjian1 小时前
text index 查看index column index定义 index 刷新频率 index视图
数据库·oracle
瀚高PG实验室2 小时前
审计策略修改
网络·数据库·瀚高数据库
言慢行善2 小时前
sqlserver模糊查询问题
java·数据库·sqlserver
韶博雅2 小时前
emcc24ai
开发语言·数据库·python
有想法的py工程师2 小时前
PostgreSQL 分区表排序优化:Append Sort 优化为 Merge Append
大数据·数据库·postgresql