0


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):当控件需要重新绘制时(如窗口显示、大小调整)触发

7.直接重写event处理各种事件

如果希望可以响应hover事件,需要写
this->setMouseTracking(true);

bool StageItemWidget::event(QEvent *e)
{
    switch (e->type()) {
    case QEvent::HoverEnter:
    case QEvent::MouseButtonPress:
    case QEvent::HoverLeave:
        closeToolTip();
        break;
    case QEvent::HoverMove:
        break;
    }
    return QWidget::event(e);
}

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()
获取鼠标的坐标,该坐标所处的坐标系是屏幕左上角的全局坐标

标签: qt ui 数据库

本文转载自: https://blog.csdn.net/m0_56049283/article/details/143266155
版权归原作者 内蒙深海大鲨鱼 所有, 如有侵权,请联系我们删除。

“qt之ui开发”的评论:

还没有评论