qt 绘制一个自定义的控件

1.qt 绘制一个自定义的控件

要点

  1. QPainter painter(this);  
  2.         painter.setPen(Qt::NoPen);  
  3.         painter.setBrush(Qt::red);  
  4.         painter.drawRect(rect()); /

在 Qt 中绘制一个自定义的控件通常涉及几个步骤。下面是一个基本的指南,说明如何创建一个自定义的 QWidget 控件并在其中进行绘制:

  1. 创建自定义控件类

    • 继承自 QWidget 或其他适当的 Qt 控件类。
    • 在头文件中定义你的类,并添加任何必要的私有成员变量。
  2. 重写绘制方法

    • 重写 paintEvent(QPaintEvent *event) 方法。这个方法会在控件需要重绘时被调用。
    • 在 paintEvent 方法中,使用 QPainter 对象来进行绘制。QPainter 提供了丰富的绘图方法,如 drawLine()drawRect()drawEllipse() 等。
  3. 处理尺寸和位置

    • 如果需要,可以重写 sizeHint() 方法来提供控件的建议大小。
    • 如果控件需要处理布局或位置变化,可以重写 resizeEvent(QResizeEvent *event) 或其他相关的事件处理函数。
  4. 添加交互性(如果需要):

    • 如果你的控件需要与用户进行交互(如鼠标点击、键盘输入等),可以重写相应的事件处理函数,如 mousePressEvent()mouseMoveEvent()keyPressEvent() 等。
  5. 在 UI 中使用自定义控件

    • 在 Qt Designer 中,可以通过提升控件的方式将标准控件替换为你的自定义控件。
    • 也可以在代码中直接创建和使用你的自定义控件。
  6. 编译和运行

    • 编译你的 Qt 项目。
    • 运行程序并查看你的自定义控件是否按预期工作。

下面是一个简单的示例代码,展示了一个自定义的 QWidget 控件,它在 paintEvent 中绘制了一个红色的矩形:

 

cpp复制代码

#include <QWidget>  
#include <QPainter>  class MyCustomWidget : public QWidget {  
protected:  void paintEvent(QPaintEvent *event) override {  QPainter painter(this);  painter.setPen(Qt::NoPen);  painter.setBrush(Qt::red);  painter.drawRect(rect()); // 绘制一个填充为红色的矩形,大小与控件相同  }  
};  // 在主窗口或其他地方使用这个自定义控件  
// MyCustomWidget *customWidget = new MyCustomWidget(this);  
// customWidget->show();

注意:这只是一个非常基础的示例。根据你的需求,你可能需要添加更多的功能和复杂性到你的自定义控件中。

2.qt 创建一个可以拖拽边线的矩形

在 Qt 中创建一个可以拖拽边线以改变其大小的矩形(通常被称为可调整大小的控件或自定义窗口部件),你需要实现一些自定义的交互逻辑。这通常涉及到重写控件的鼠标事件处理函数(如 mousePressEventmouseMoveEvent 和 mouseReleaseEvent)以及可能的尺寸调整逻辑。

以下是一个基本的步骤指南,用于在 Qt 中创建一个可以拖拽边线以调整大小的矩形控件:

  1. 创建自定义控件类
    继承一个现有的 Qt 控件类(如 QWidget 或 QGraphicsItem,取决于你的应用程序架构)来创建你的自定义控件类。

  2. 重写鼠标事件处理函数
    在自定义控件类中,重写 mousePressEventmouseMoveEvent 和 mouseReleaseEvent 函数来处理鼠标事件。

    • 在 mousePressEvent 中,记录鼠标按下时的位置,并确定用户是否点击了控件的边线(可能通过检查鼠标位置与控件边界的距离)。
    • 在 mouseMoveEvent 中,如果鼠标已被按下并且用户正在移动鼠标,根据鼠标的移动量和点击的位置来调整控件的大小。这通常涉及到调用 resize 或 setGeometry 函数。
    • 在 mouseReleaseEvent 中,处理鼠标释放事件,结束大小调整操作。
  3. 实现边线检测
    为了确定用户是否点击了控件的边线,你可以在 mousePressEvent 中检查鼠标位置。如果鼠标位置接近控件的某个边线(例如,在边线附近的一定范围内),则将该边线标记为当前可调整的边线。

  4. 调整控件大小
    在 mouseMoveEvent 中,当用户移动鼠标时,根据鼠标的移动量和点击的边线来调整控件的大小。这通常涉及到计算新的控件尺寸,并调用 resize 或 setGeometry 函数来应用这些更改。

  5. 添加视觉反馈
    为了提高用户体验,你可以在用户拖拽边线时添加视觉反馈。例如,你可以改变控件的边框颜色或显示一个调整手柄(resize handle)。

  6. 集成到应用程序中
    最后,将你的自定义控件集成到你的 Qt 应用程序中。这通常涉及到在你的主窗口或其他容器控件中实例化并添加你的自定义控件。

请注意,这个指南提供了一个高级概述,并没有提供具体的代码实现。根据你的具体需求和应用程序的复杂性,实现细节可能会有所不同。如果你需要更具体的代码示例或进一步的帮助,请随时提问!

3.qt 创建一个可以拖拽边线的矩形 举例

 

要创建一个可以拖拽边线来调整大小的矩形控件,你需要处理鼠标事件来确定何时以及如何调整控件的大小。以下是一个简单的示例,展示如何在 Qt 中实现这样的自定义控件:

首先,创建一个继承自 QWidget 的类,并重写鼠标事件处理函数:

#include <QWidget>  
#include <QMouseEvent>  
#include <QApplication>  class ResizableRectWidget : public QWidget {  Q_OBJECT  public:  ResizableRectWidget(QWidget *parent = nullptr) : QWidget(parent), resizing(false), resizeEdge(Qt::NoEdge) {  // 设置鼠标追踪以便在移动鼠标时接收事件  setMouseTracking(true);  }  protected:  void mousePressEvent(QMouseEvent *event) override {  if (event->button() == Qt::LeftButton) {  // 检查鼠标是否接近控件的边线  if ((event->pos().x() < RESIZE_HANDLE_SIZE && event->pos().y() > height() - RESIZE_HANDLE_SIZE)  || (event->pos().x() > width() - RESIZE_HANDLE_SIZE && event->pos().y() > height() - RESIZE_HANDLE_SIZE)) {  // 假设我们在右下角有一个调整手柄  resizeEdge = Qt::BottomRightCorner;  resizing = true;  originalSize = size();  originalPos = event->pos();  }  // 你可以为其他边线添加类似的逻辑  }  }  void mouseMoveEvent(QMouseEvent *event) override {  if (resizing) {  int dx = event->x() - originalPos.x();  int dy = event->y() - originalPos.y();  if (resizeEdge == Qt::BottomRightCorner) {  // 调整右下角大小  resize(originalSize.width() + dx, originalSize.height() + dy);  }  // 为其他边线添加类似的逻辑  }  }  void mouseReleaseEvent(QMouseEvent *event) override {  if (event->button() == Qt::LeftButton && resizing) {  resizing = false;  resizeEdge = Qt::NoEdge;  }  }  private:  bool resizing;  Qt::Edge resizeEdge;  QSize originalSize;  QPoint originalPos;  static const int RESIZE_HANDLE_SIZE = 10; // 假设调整手柄的大小为10x10像素  
};  int main(int argc, char *argv[]) {  QApplication app(argc, argv);  ResizableRectWidget widget;  widget.setGeometry(100, 100, 200, 100); // 设置初始位置和大小  widget.show();  return app.exec();  
}  #include "main.moc"

在这个示例中,我们创建了一个 ResizableRectWidget 类,它继承自 QWidget。我们重写了 mousePressEventmouseMoveEvent 和 mouseReleaseEvent 函数来处理鼠标事件。在 mousePressEvent 中,我们检查鼠标是否点击了控件的右下角(或你可以添加其他边线的逻辑)。如果是,我们设置 resizing 标志为 true,并保存原始大小和位置。在 mouseMoveEvent 中,如果 resizing 为 true,我们根据鼠标的移动来调整控件的大小。在 mouseReleaseEvent 中,我们重置 resizing 标志。

请注意,这个示例非常基础,只处理了右下角的调整。你可以根据需要为其他边线添加类似的逻辑。此外,你可能还想添加一些视觉反馈(如改变边框颜色或显示一个小的调整手柄)来提高用户体验。

4.Qt::NoEdge

在 Qt 框架中,Qt::Edge 枚举是用来指定窗口或控件的边缘的。但是,Qt::NoEdge 并不是 Qt::Edge 枚举的一个直接成员。不过,这个名称可能被用作一个特殊的值或标志,表示没有边缘或不需要考虑边缘。

在 Qt 的某些上下文中,你可能会遇到与边缘相关的设置或属性,但 Qt::NoEdge 本身可能不是一个标准的 Qt 枚举值。但是,你可以在一些自定义的类、函数或算法中看到它作为一个标志或枚举值被使用。

如果你在某个特定的 Qt 类或函数上下文中看到 Qt::NoEdge,最好查阅该类的文档或相关的源代码,以了解 Qt::NoEdge 的确切含义和用途。

另外,Qt 提供了许多与边缘和边框相关的样式属性和枚举值,例如 QFrame::Shape 枚举(用于 QFrame 控件的边框形状)和 QPen 类(用于绘制具有不同样式、宽度和颜色的线条)。如果你需要处理窗口或控件的边缘,这些可能是更有用的参考。

5.Qt::BottomRightCorner

 

Qt::BottomRightCorner 是 Qt 框架中的一个枚举值,它表示窗口或控件的一个特定角落。在 Qt 的 QMainWindow 类中,setCorner() 方法被用来设置这些角落的归属。具体来说,Qt::BottomRightCorner 指的是窗口或控件的底部右角。

在使用 setCorner() 方法时,你通常会将 Qt::BottomRightCorner 与另一个枚举值(表示停靠窗口区域)一起使用,以指定该角落应该属于哪个停靠窗口区域。例如,如果你想将底部右角设置为右侧停靠窗口区域的一部分,你可以这样做:

mainWindow->setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);

但请注意,在提供的代码示例中,枚举值 Qt::BottomRightCorner 似乎有一个小错误。正确的枚举值应该是 Qt::BottomRightCorner

归纳一下,Qt::BottomRightCorner 的主要用法和相关信息如下:

  • 表示位置:它表示窗口或控件的底部右角。
  • 与 setCorner() 方法一起使用:通过 setCorner() 方法,你可以将 Qt::BottomRightCorner 与另一个枚举值结合使用,以指定该角落应该属于哪个停靠窗口区域。
  • 正确的枚举值:确保使用正确的枚举值 Qt::BottomRightCorner(而不是 Qt::BottomRightCorner)。

这样的设置通常用于自定义 QMainWindow 的停靠窗口布局,使其更符合你的应用程序需求。

6.qt 鼠标事件 

在 Qt 中,处理鼠标事件通常涉及重写几个特定的函数,这些函数在鼠标与你的控件或窗口进行交互时被调用。以下是一些常用的鼠标事件处理函数:

  1. mousePressEvent(QMouseEvent *event):当在控件上按下鼠标按钮时调用。
  2. mouseMoveEvent(QMouseEvent *event):当鼠标在控件上移动时调用,如果启用了鼠标追踪(setMouseTracking(true)),则在没有按下任何按钮的情况下也会调用。
  3. mouseReleaseEvent(QMouseEvent *event):当在控件上释放鼠标按钮时调用。
  4. mouseDoubleClickEvent(QMouseEvent *event):当在控件上双击鼠标时调用。
  5. wheelEvent(QWheelEvent *event):当在控件上使用鼠标滚轮时调用。

每个事件处理函数都接收一个事件对象(如 QMouseEvent 或 QWheelEvent),这些对象包含了关于事件的信息,如鼠标的位置、按下的按钮等。

下面是一个简单的示例,展示了如何在自定义的 QWidget 子类中处理鼠标按下和移动事件,以便用户可以拖拽控件的右下角来调整其大小:

#include <QWidget>  
#include <QMouseEvent>  
#include <QApplication>  class ResizableWidget : public QWidget {  Q_OBJECT  public:  ResizableWidget(QWidget *parent = nullptr) : QWidget(parent), resizing(false) {  // 启用鼠标追踪  setMouseTracking(true);  }  protected:  void mousePressEvent(QMouseEvent *event) override {  if (event->button() == Qt::LeftButton) {  // 检查是否接近右下角  if (event->pos().x() > width() - 10 && event->pos().y() > height() - 10) {  resizing = true;  resizeStart = event->pos();  }  }  }  void mouseMoveEvent(QMouseEvent *event) override {  if (resizing) {  int dx = event->x() - resizeStart.x();  int dy = event->y() - resizeStart.y();  // 调整控件大小,同时保持位置不变  resize(width() + dx, height() + dy);  // 更新起始位置,以便下一次移动  resizeStart = event->pos();  }  }  void mouseReleaseEvent(QMouseEvent *event) override {  if (event->button() == Qt::LeftButton) {  resizing = false;  }  }  private:  bool resizing;  QPoint resizeStart;  
};  int main(int argc, char *argv[]) {  QApplication app(argc, argv);  ResizableWidget widget;  widget.setGeometry(100, 100, 200, 100);  widget.show();  return app.exec();  
}  #include "main.moc"

在这个示例中,我们创建了一个名为 ResizableWidget 的自定义控件,它允许用户通过拖拽其右下角来调整大小。当用户按下鼠标左键并移动到接近控件的右下角时,我们开始调整控件的大小。当用户释放鼠标左键时,我们停止调整。注意,这里我们简单地使用了一个 10x10 像素的区域作为“拖拽手柄”,但你可以根据需要调整这个大小。

7.enum MouseButton

在 Qt 中,没有直接名为 MouseButton 的枚举类型,但是 Qt 的事件处理系统,特别是在处理鼠标事件时,会引用鼠标按钮的状态。通常,鼠标按钮的状态是通过位掩码(bitmask)来表示的,这些位掩码定义在 Qt::MouseButton 枚举中。

Qt::MouseButton 枚举包含了表示不同鼠标按钮的常量,例如 Qt::LeftButtonQt::RightButtonQt::MiddleButton 等。这些常量通常用于检查鼠标事件(如 QMouseEvent)中哪个按钮被按下或释放。

以下是一些 Qt::MouseButton 枚举中常用的常量:

  • Qt::NoButton:没有按钮被按下。
  • Qt::LeftButton:鼠标左键按钮。
  • Qt::RightButton:鼠标右键按钮。
  • Qt::MiddleButton:鼠标中键按钮(通常是滚轮按钮)。
  • Qt::XButton1:额外的鼠标按钮 1(通常是鼠标侧面的一个按钮)。
  • Qt::XButton2:额外的鼠标按钮 2(同样是鼠标侧面的一个按钮,但通常是另一个)。

在处理鼠标事件时,你可以使用这些常量来检查哪个按钮被按下或释放。例如,在 mousePressEvent 方法中,你可以这样做:

void MyWidget::mousePressEvent(QMouseEvent *event) {  if (event->button() == Qt::LeftButton) {  // 鼠标左键被按下  } else if (event->button() == Qt::RightButton) {  // 鼠标右键被按下  }  // ... 其他处理 ...  
}

在这个例子中,event->button() 返回了一个 Qt::MouseButton 枚举值,表示被按下的鼠标按钮。你可以使用 == 运算符来比较这个值和 Qt::MouseButton 枚举中的常量。

8. 修改鼠标的形状

在 Qt 中,要修改鼠标的形状(也称为鼠标光标),你可以使用 QCursor 类。QCursor 类提供了设置和获取系统鼠标光标的功能。

以下是如何在 Qt 应用程序中修改鼠标形状的基本步骤:

  1. 包含必要的头文件
    你需要包含 QCursor 类的头文件。

     

    cpp复制代码

    #include <QCursor>
  2. 选择或创建光标
    QCursor 类提供了一些预定义的光标类型,如 Qt::ArrowCursor(默认箭头)、Qt::CrossCursor(十字线)等。你也可以使用自定义的光标图像。

  3. 设置光标
    使用 QCursor 的静态方法 setPos 来设置光标的位置(如果需要),或者使用 QApplication::setOverrideCursor 来设置整个应用程序的光标。

    对于整个应用程序的光标设置,你可以这样做:

     

    cpp复制代码

    QApplication::setOverrideCursor(QCursor(Qt::CrossCursor)); // 设置整个应用程序的光标为十字线

    当你想要恢复默认光标时,可以这样做:

     

    cpp复制代码

    QApplication::restoreOverrideCursor(); // 恢复默认光标

    对于单个控件或窗口,你可能需要重写事件处理器(如 enterEventleaveEvent)来在控件上进入或离开时更改光标。

  4. 使用自定义光标图像
    如果你想要使用自定义的光标图像,你可以创建一个 QPixmap 对象,并将其传递给 QCursor 的构造函数。

     

    cpp复制代码

    QPixmap pixmap("path/to/your/cursor.png"); // 替换为你的光标图像路径
    QCursor customCursor(pixmap, 0, 0); // 第二个和第三个参数是光标在图像中的热点(通常是光标的尖端)
    this->setCursor(customCursor); // 设置当前控件的光标

    请注意,不是所有的光标图像都能在所有操作系统和硬件上正常工作。你可能需要为你的应用程序提供不同分辨率的光标图像,并确保它们与你的应用程序的用户界面风格相匹配。

  5. 清理
    当你不再需要自定义光标时,确保恢复默认光标或设置其他适当的光标,以避免混淆用户。

  6. 注意事项

    • 自定义光标可能会影响应用程序的性能,特别是在使用高分辨率图像时。
    • 在某些操作系统上,自定义光标可能无法正常工作或显示。
    • 始终在更改光标之前测试你的应用程序,以确保它在目标平台上按预期工作。

9.光标的类型一共有多少种 

在 Qt 中,光标的类型是由 QCursor 类和 Qt::CursorShape 枚举来定义的。尽管无法确切给出光标的具体数量(因为 Qt 的版本更新可能会增加或修改光标类型),但我可以基于现有信息和参考文章给出一些常见的光标类型。

Qt::CursorShape 枚举中包含的光标类型通常包括:

  1. Qt::ArrowCursor:标准箭头光标。
  2. Qt::UpArrowCursor:向上箭头光标。
  3. Qt::CrossCursor:十字光标。
  4. Qt::WaitCursor:等待光标,通常显示为沙漏或旋转图标。
  5. Qt::IBeamCursor:文本编辑光标,类似于“I”型光标。
  6. Qt::SizeVerCursor:垂直调整大小的光标。
  7. Qt::SizeHorCursor:水平调整大小的光标。
  8. Qt::SizeBDiagCursor:对角线双向调整大小的光标(从左下角到右上角)。
  9. Qt::SizeFDiagCursor:对角线双向调整大小的光标(从左上角到右下角)。
  10. Qt::SizeAllCursor:四个方向的调整大小光标。
  11. Qt::BlankCursor:隐藏光标。

此外,Qt::CursorShape 还包括了其他几个光标类型,但这里列出的是一些常见的和常用的。

请注意,Qt 允许你使用自定义的光标图像,这意味着你可以创建并使用任何你想要的光标形状。自定义光标是通过将 QPixmap 对象传递给 QCursor 的构造函数来实现的。

总的来说,Qt 中的光标类型数量取决于预定义的光标形状和你创建的自定义光标数量。由于 Qt 是一个不断发展的框架,新的光标类型可能会在未来的版本中添加。

10.设置一个可以向右侧缩放的矩形

 

在 Qt 中,要实现一个可以向右侧缩放的矩形,通常你需要自定义一个控件(比如继承自 QWidget 或 QGraphicsItem),并在其中处理鼠标事件来控制矩形的缩放。这里我提供一个基于 QWidget 的简单示例,说明如何实现这一功能。

  1. 创建自定义控件:首先,你需要创建一个继承自 QWidget 的类。
  2. 重写鼠标事件处理函数:在这个类中,你需要重写 mousePressEventmouseMoveEvent 和 mouseReleaseEvent 来处理鼠标的按下、移动和释放事件。
  3. 实现缩放逻辑:在 mouseMoveEvent 中,你可以根据鼠标的移动距离来调整矩形的大小。

以下是一个简单的示例代码:

#include <QWidget>  
#include <QMouseEvent>  
#include <QPainter>  class ResizableRectangle : public QWidget {  Q_OBJECT  public:  ResizableRectangle(QWidget *parent = nullptr) : QWidget(parent), resizing(false), resizePos(0, 0) {}  protected:  void paintEvent(QPaintEvent *event) override {  QPainter painter(this);  painter.drawRect(rect()); // 绘制矩形,你可以根据需要设置矩形的样式  }  void mousePressEvent(QMouseEvent *event) override {  if (event->button() == Qt::RightButton && event->pos().x() > width() - 10) { // 假设在矩形右侧10像素范围内按下右键开始缩放  resizing = true;  resizePos = event->pos();  }  }  void mouseMoveEvent(QMouseEvent *event) override {  if (resizing) {  int delta = event->pos().x() - resizePos.x(); // 计算鼠标移动的距离  resize(width() + delta, height()); // 调整矩形大小  resizePos = event->pos(); // 更新缩放起始位置  update(); // 更新显示  }  }  void mouseReleaseEvent(QMouseEvent *event) override {  if (event->button() == Qt::RightButton) {  resizing = false;  }  }  private:  bool resizing; // 是否正在缩放  QPoint resizePos; // 缩放起始位置  
};  // 在你的主窗口或其他地方使用这个自定义控件  
ResizableRectangle *rectWidget = new ResizableRectangle(this);  
rectWidget->setGeometry(100, 100, 100, 100); // 设置初始位置和大小  
rectWidget->show();

这个示例代码创建了一个名为 ResizableRectangle 的自定义控件,它可以在其右侧通过右键拖动来向右侧缩放。注意,这个示例很简单,并没有处理一些边界情况(比如当矩形变得太小时),你可能需要根据你的具体需求来完善它。

11.设置一个可以向左侧缩放的矩形

要设置一个可以向左侧缩放的矩形,你需要稍微调整之前示例中的鼠标事件处理逻辑。下面是一个修改后的示例代码,演示了如何实现一个可以向左侧缩放的矩形:

#include <QWidget>  
#include <QMouseEvent>  
#include <QPainter>  class ResizableRectangle : public QWidget {  Q_OBJECT  public:  ResizableRectangle(QWidget *parent = nullptr) : QWidget(parent), resizing(false), resizeWidth(0) {}  protected:  void paintEvent(QPaintEvent *event) override {  QPainter painter(this);  QRect rectToDraw = QRect(0, 0, resizeWidth, height());  painter.drawRect(rectToDraw); // 绘制矩形  }  void mousePressEvent(QMouseEvent *event) override {  if (event->button() == Qt::RightButton && event->pos().x() < 10) { // 假设在矩形左侧10像素范围内按下右键开始缩放  resizing = true;  resizeWidth = width(); // 保存原始宽度  originalMousePos = event->pos();  }  }  void mouseMoveEvent(QMouseEvent *event) override {  if (resizing) {  int delta = originalMousePos.x() - event->pos().x(); // 计算鼠标移动的距离  if (resizeWidth - delta > 0) { // 确保矩形不会缩小到0以下  resizeWidth -= delta; // 调整矩形宽度  update(); // 更新显示  }  }  }  void mouseReleaseEvent(QMouseEvent *event) override {  if (event->button() == Qt::RightButton) {  resizing = false;  }  }  private:  bool resizing; // 是否正在缩放  int resizeWidth; // 矩形的当前宽度  QPoint originalMousePos; // 缩放开始时鼠标的位置  
};  // 在你的主窗口或其他地方使用这个自定义控件  
ResizableRectangle *rectWidget = new ResizableRectangle(this);  
rectWidget->setGeometry(100, 100, 100, 100); // 设置初始位置和大小  
rectWidget->show();

在这个示例中,我们添加了一个 resizeWidth 变量来跟踪矩形的当前宽度。在 mousePressEvent 中,我们检查鼠标是否在矩形的左侧10像素范围内按下右键,并开始缩放。在 mouseMoveEvent 中,我们计算鼠标移动的距离,并相应地调整矩形的宽度。注意,我们检查新宽度是否大于0,以确保矩形不会完全消失。在 mouseReleaseEvent 中,我们停止缩放。

此外,我们修改了 paintEvent 以使用 resizeWidth 变量来绘制矩形,而不是直接使用控件的宽度。这样,即使控件的宽度保持不变(因为控件的大小是固定的),我们也可以绘制一个不同宽度的矩形。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/44983.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷粒商城实战-25-分布式组件-SpringCloud Alibaba-Nacos配置中心-加载多配置集

文章目录 一&#xff0c;拆分配置集二&#xff0c;配置文件中配置多配置集1&#xff0c;引用多配置集2&#xff0c;验证 三&#xff0c;多配置集总结1&#xff0c;使用场景2&#xff0c;优先级 这一节介绍如何加载多个配置集。 大多数情况下&#xff0c;我们把配置全部放在一个…

vite build 打包错误提示 EBUSY: resource busy or locked, copyfile ‘D:\gtv-web

EBUSY: resource busy or locked, copyfile D:\gtv-web 报错解释&#xff1a; 当前应用正在运行中&#xff0c;把应用进程关掉即可 EBUSY: resource busy or locked 错误表明尝试使用的资源正被另一个进程占用或锁定。在这种情况下&#xff0c;copyfile 命令试图复制文件到指…

C语言 结构体和共用体——对结构体的操作

目录 如何访问结构体的成员&#xff1f; 结构体变量的赋值操作 结构体变量的取地址值操作 如何访问结构体的成员&#xff1f; 结构体变量的赋值操作 结构体变量的取地址值操作

华为机考真题 -- 堆内存申请

题目描述: 有一个总空间为100字节的堆,现要从中新申请一块内存,内存分配原则为:优先紧接着前一块已使用内存,分配空间足够且最接近申请大小的空闲内存。 输入描述: 第1行是1个整数,表示期望申请的内存字节数 第2到第N行是用空格分割的两个整数,表示当前已分配的内存…

华为机考真题 -- 简易内存池

题目描述: 请实现一个简易内存池,根据请求命令完成内存分配和释放。内存池支持两种操作命令,REQUEST和RELEASE,其格式为: REQUEST=请求的内存大小,表示请求分配指定大小内存. 如果分配成功,返回分配到的内存首地址; 如果内存不足,或指定的大小为0,则输出error; R…

如何为谷歌seo打好基础?

选择获取一个合适的域名&#xff0c;选择一个好的域名是 SEO 成功的第一步。以下是一些建议&#xff1a; 域名名称&#xff1a;要短小易记&#xff0c;不要强行插入关键词。最好用你的公司名称&#xff0c;避免使用连字符或特殊字符。用户在输入一个复杂的域名时容易出错&…

FastAPI -- 第一弹

Hello World 经典的 Hello World 安装 pip install fastapi pip install "uvicorn[standard]"main.py from typing import Unionfrom fastapi import FastAPIapp FastAPI()app.get("/") def read_root():return {"Hello": "World"}…

【React Hooks原理 - useReducer】

概述 众所周知useState是基于useReducer来实现状态更新的&#xff0c;在前面我们介绍过useState的原理&#xff0c;所以在这里介绍下useReducer。本文主要从基础使用入手&#xff0c;再进一步从源码来看useReducer实现原理两个方面来介绍useReducer这个Hook。由于本文省略了部…

Google 面试:从忐忑不安到意外的友善体验

一、面试前的忐忑不安 站于Google门前&#xff0c;犹如面临生死抉择&#xff0c;心脏如擂鼓般狂跳不止。我手中紧握着精心准备的简历&#xff0c;心中忐忑不安。Google&#xff0c;这一科技巨头的名字&#xff0c;对我而言&#xff0c;既是理想的彼岸&#xff0c;亦是恐惧的深…

Ozon俄罗斯哪些产品热销中?Ozon7月市场热卖趋势放送

Ozon俄罗斯哪些产品热销工具&#xff1a;D。DDqbt。COm/74rD 据Ozon数据&#xff0c;2023年&#xff0c;在自提服务方面&#xff0c;Ozon投资了100亿扩展自提网络&#xff0c;自提点数量激增至超过5万个&#xff0c;是之前的2.6倍。 物流基础设施方面&#xff0c;Ozon在仓库建…

【vueUse库Reactivity模块各函数简介及使用方法--上篇】

vueUse库是一个专门为Vue打造的工具库,提供了丰富的功能,包括监听页面元素的各种行为以及调用浏览器提供的各种能力等。其中的Browser模块包含了一些实用的函数,以下是这些函数的简介和使用方法: vueUse库Sensors模块各函数简介及使用方法 vueUseReactivity函数1. compute…

树莓派4B_OpenCv学习笔记19:OpenCV舵机云台物体追踪

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; Python 版本3.7.3&#xff1a; ​​ 今日学习&#xff1…

【数据结构】排序——快速排序

前言 本篇博客我们继续介绍一种排序——快速排序&#xff0c;让我们看看快速排序是怎么实现的 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 ​ 目录 …

前端JS特效第30波:jquery图片列表按顺序分类排列图片组效果

jquery图片列表按顺序分类排列图片组效果&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> &…

Profibus协议转Profinet协议网关模块连接智能电表通讯案例

一、背景 在工业自动化领域&#xff0c;Profibus协议和Profinet协议是两种常见的工业通讯协议&#xff0c;而连接智能电表需要用到这两种协议之间的网关模块。本文将通过一个实际案例&#xff0c;详细介绍如何使用Profibus转Profinet模块&#xff08;XD-PNPBM20&#xff09;实…

vue2 实现原生 WebSocket

原生WebSocket&#xff1a; new WebSocket WebSocket | ThinkTS官网 export default {data() {return {socket: null};},created() {// 1. 创建 WebSocket 实例this.socket new WebSocket(ws://localhost:3000);// 2. 监听 WebSocket 连接打开事件this.socket.onopen () &g…

MySQL常见的几种索引类型及对应的应用场景

MySQL 提供了多种索引类型&#xff0c;每种索引类型都有其特定的应用场景和优势。以下是 MySQL 中常见的几种索引类型及其具体应用场景&#xff1a; 1. B-Tree 索引 特点&#xff1a; B-Tree&#xff08;Balanced Tree&#xff0c;平衡树&#xff09;是 MySQL 的默认索引类型…

启航IT之旅:为新生绘制的学习路线图

随着七月的热浪悄悄席卷而来&#xff0c;各地高考成绩陆续放榜&#xff0c;对于刚迈过高考这座独木桥的你们&#xff0c;这不仅仅是一个故事的终章&#xff0c;更是另一段冒险的序曲。特别是那些心中有一团IT火焰燃烧的少年们&#xff0c;暑假的钟声已经敲响&#xff0c;是时候…

坑3.上传图片(阿里云空间,oss验证)(未验证)

笔记 20240710 未验证&#xff0c;现在还没有阿里云空间&#xff0c;等买个sit环境就可以验证一下。 前端 页面 <!--页面--> <el-form-item label"优惠券图片" prop"couponImg"><single-upload v-model"dataForm.couponImg"&g…