Qt实战 无边框窗口的实现

2023-10-27

本次分享,是基于Qt实现了无边框的窗口,并支持拖动缩放、最大化、最小化、关闭、双击全屏等。

实现无边框其实很简单,一行代码搞定。

setWindowFlag(Qt::FramelessWindowHint);

但是,隐藏了窗口的默认边框,标题栏没了,窗口无法进行拖动缩放了,最小化最大化关闭按钮也没有了,因此都需要自己实现。

为了实现无边框窗口到窗口背景的清晰过度,还需要给边框加border线或过度阴影。(本文不提供过度阴影,感兴趣的可以自己去研究,Qt有相关的类可实现)

如果将这个无边框的窗口应用到所有窗口,即如何将无边框窗口作为一个容器使用,也是本文需要解决的问题

首先给大家展示一下效果图。

Qt实战 无边框窗口的实现

无边框窗口类实现

SuperWindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>SuperWindow</class>
 <widget class="QWidget" name="SuperWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>SuperWindow</string>
  </property>
  <property name="styleSheet">
   <string notr="true">QWidget#titleBar{
	background-color: rgb(150, 150, 150);
}

QPushButton[type=&quot;btn_win_ctrl&quot;]
{
	max-width: 20px;
	max-height: 20px;

	border:  1px solid rgba(100, 100, 100, 50);
}
QPushButton[type=&quot;btn_win_ctrl&quot;]:hover
{
	border:  1px solid blue;
}
QPushButton[type=&quot;btn_win_ctrl&quot;]:pressed
{
	border:  2px solid blue;
}
QPushButton[type=&quot;btn_win_ctrl&quot;]#btnMinimize
{
	background: center url(:/icons/minium.png) no-repeat;
}
QPushButton[type=&quot;btn_win_ctrl&quot;]#btnClose
{
	background: center url(:/icons/close.png) no-repeat;
}


QLabel#lbWinIcon
{
	max-width: 20px;
	max-height: 20px;
	min-width: 20px;
	min-height: 20px;
}</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <property name="spacing">
    <number>2</number>
   </property>
   <property name="leftMargin">
    <number>3</number>
   </property>
   <property name="topMargin">
    <number>3</number>
   </property>
   <property name="rightMargin">
    <number>3</number>
   </property>
   <property name="bottomMargin">
    <number>3</number>
   </property>
   <item>
    <widget class="QWidget" name="titleBar" native="true">
     <property name="maximumSize">
      <size>
       <width>16777215</width>
       <height>30</height>
      </size>
     </property>
     <layout class="QHBoxLayout" name="horizontalLayout">
      <property name="spacing">
       <number>2</number>
      </property>
      <property name="leftMargin">
       <number>2</number>
      </property>
      <property name="topMargin">
       <number>2</number>
      </property>
      <property name="rightMargin">
       <number>2</number>
      </property>
      <property name="bottomMargin">
       <number>2</number>
      </property>
      <item>
       <widget class="QLabel" name="lbWinIcon">
        <property name="text">
         <string/>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QLabel" name="lbTitle">
        <property name="text">
         <string>标题</string>
        </property>
       </widget>
      </item>
      <item>
       <spacer name="horizontalSpacer">
        <property name="orientation">
         <enum>Qt::Horizontal</enum>
        </property>
        <property name="sizeHint" stdset="0">
         <size>
          <width>40</width>
          <height>20</height>
         </size>
        </property>
       </spacer>
      </item>
      <item>
       <widget class="QPushButton" name="btnMinimize">
        <property name="text">
         <string/>
        </property>
        <property name="type" stdset="0">
         <string>btn_win_ctrl</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QPushButton" name="btnMaxmize">
        <property name="text">
         <string/>
        </property>
        <property name="type" stdset="0">
         <string>btn_win_ctrl</string>
        </property>
        <property name="bMax" stdset="0">
         <bool>false</bool>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QPushButton" name="btnClose">
        <property name="text">
         <string/>
        </property>
        <property name="type" stdset="0">
         <string>btn_win_ctrl</string>
        </property>
       </widget>
      </item>
     </layout>
    </widget>
   </item>
   <item>
    <widget class="QWidget" name="wgtContent" native="true">
     <layout class="QGridLayout" name="gridLayout_2">
      <property name="leftMargin">
       <number>0</number>
      </property>
      <property name="topMargin">
       <number>0</number>
      </property>
      <property name="rightMargin">
       <number>0</number>
      </property>
      <property name="bottomMargin">
       <number>0</number>
      </property>
      <item row="0" column="0">
       <layout class="QGridLayout" name="gridContent"/>
      </item>
     </layout>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

SuperWindow.h

#pragma once

#include "ui_SuperWindow.h"
#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class SuperWindow; }
QT_END_NAMESPACE

class SuperWindow : public QWidget
{
    Q_OBJECT

public:
    SuperWindow(QWidget *parent = nullptr);
    ~SuperWindow();
    template<typename T>
    T *CentralWidget()
    {
        if (!m_centralWgt) return nullptr;
        return qobject_cast<T*>(m_centralWgt);
    }

    void SetTitle(QString title);

    template<typename T>
    static SuperWindow* Create(QWidget* parent = nullptr)
    {
        SuperWindow* fw = new SuperWindow(parent);
        T* centralWgt = new T(fw);
        fw->SetCentralWidget(centralWgt);
        return fw;
    }

protected:
    void mouseDoubleClickEvent(QMouseEvent* event);
    void mousePressEvent(QMouseEvent* event);
    void mouseMoveEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent* event);
    void paintEvent(QPaintEvent* e);
    void leaveEvent(QEvent* e);

private:
    void SetCentralWidget(QWidget *widget);

    //计算九宫格行
    int row(QPointF pos);
    //计算九宫格列
    int col(QPointF pos);
    //点击区域 相对于九宫格
    int moveArea(QPointF pos);
    void setMouseStyle(int moveArea);

private slots:
    void OnMaxmized();

private:
    Ui::SuperWindow *ui;
    QWidget* m_centralWgt{ nullptr };

    bool m_bPressed{ false };
    bool m_bResizing{false};
    int m_flag;
    QPoint curPos;
    int m_nBorder{ 3 };
};

SuperWindow.cpp

#include "SuperWindow.h"

#include <QMouseEvent>
#include <QPainter>

SuperWindow::SuperWindow(QWidget* parent)
    : QWidget(parent)
    , ui(new Ui::SuperWindow)
{
    ui->setupUi(this);
    setWindowFlag(Qt::FramelessWindowHint);
    setMouseTracking(true);

    ui->btnMaxmize->setIcon(QIcon(":/icons/maxsize.png"));


    for (auto obj : children()) {
        auto wgt = qobject_cast<QWidget*>(obj);
        if (wgt) wgt->setMouseTracking(true);
    }

    connect(ui->btnMinimize, &QPushButton::clicked, this, &SuperWindow::showMinimized);
    connect(ui->btnMaxmize, &QPushButton::clicked, this, &SuperWindow::OnMaxmized);
    connect(ui->btnClose, &QPushButton::clicked, this, &SuperWindow::close);
}

SuperWindow::~SuperWindow()
{
    delete ui;
}

void SuperWindow::SetTitle(QString title)
{
    ui->lbTitle->setText(title);
    setWindowTitle(title);
}

void SuperWindow::SetCentralWidget(QWidget *widget)
{
    if (m_centralWgt) return;
    m_centralWgt = widget;
    ui->gridContent->addWidget(widget);
}

void SuperWindow::mouseDoubleClickEvent(QMouseEvent* event)
{
    if (event->button() == Qt::LeftButton)
    {
        if (ui->titleBar->geometry().contains(event->pos()))
        {
            OnMaxmized();
        }
    }
}

void SuperWindow::mousePressEvent(QMouseEvent* event)
{
    if (event->button() == Qt::LeftButton)
    {
        if (ui->titleBar->geometry().contains(event->pos()) &&
            this->cursor() == Qt::ArrowCursor)
        {
            m_bPressed = true;
            curPos = event->globalPosition().toPoint();
        }
        else if (m_flag != 22)
        {
            m_bResizing = true;
            curPos = event->globalPosition().toPoint();
        }
    }
}

void SuperWindow::mouseMoveEvent(QMouseEvent* event)
{
    if (m_bPressed) //如果鼠标左键按下
    {
        QPoint tmpPos = event->globalPosition().toPoint();
        QPoint delta = tmpPos - curPos;
        move(pos() + delta);
        curPos = tmpPos;
    }
    else
    {
        if (!m_bResizing)
        {
            m_flag = moveArea(event->pos());
            setMouseStyle(m_flag);
            return;
        }

        qDebug() << "resizing " << event->pos();

        QPoint tmpPos = event->globalPosition().toPoint();
        QPoint delta = tmpPos - curPos;
        curPos = tmpPos;

        //记录窗体当前位置
        QRect rect = geometry();
        //鼠标左键处于拖拽拉伸区域
        //m_flag为鼠标点击左键时  鼠标样式状态
        switch (m_flag)
        {
        case 11: rect.setTopLeft(rect.topLeft() + delta); break; //左上角
        case 13: rect.setTopRight(rect.topRight() + delta); break; //右上角
        case 31: rect.setBottomLeft(rect.bottomLeft() + delta);  break;  //左下角
        case 33: rect.setBottomRight(rect.bottomRight() + delta); break;  //右下角
        case 12: rect.setTop(rect.top() + delta.y()); break; //上
        case 21: rect.setLeft(rect.left() + delta.x()); break; //左
        case 23: rect.setRight(rect.right() + delta.x()); break; //右
        case 32: rect.setBottom(rect.bottom() + delta.y()); break; //下        
        default: break;
        }
        this->setGeometry(rect);
    }
}

void SuperWindow::mouseReleaseEvent(QMouseEvent* event)
{
    Q_UNUSED(event);
    if (event->button() == Qt::LeftButton)
    {
        if (m_bPressed) m_bPressed = false;
       
        if (m_bResizing)
        {
            m_bResizing = false;
            m_flag = 22;
            update();
        }
    }
}

void SuperWindow::paintEvent(QPaintEvent* e)
{
    QPainter painter(this);
    {
        painter.save();
        QRect rect(m_nBorder/2, m_nBorder/2, width()-m_nBorder/2, height()-m_nBorder/2);

        QPen pen;
        pen.setColor(Qt::lightGray);
        pen.setWidth(m_nBorder);
        painter.setPen(pen);

        painter.drawRect(rect);
        painter.restore();
    }

    if (m_flag == 22) return;
    else
    {
        QBrush brush;
        brush.setColor(QColor(73, 95, 22, 150));//设置颜色
        brush.setStyle(Qt::SolidPattern);
        painter.setBrush(brush);
        painter.setPen(Qt::NoPen);

        switch (m_flag)
        {
        case 12:
        {
            QRect rect(0, 0, width(), m_nBorder);
            painter.drawRect(rect);
            break;
        }
        case 21:
        {
            QRect rect(0, 0, m_nBorder, height());
            painter.drawRect(rect);
            break;
        }
        case 23:
        {
            QRect rect(width()-m_nBorder, 0, m_nBorder, height());
            painter.drawRect(rect);
            break;
        }
        case 32:
        {
            QRect rect(0, height()-m_nBorder, width(), m_nBorder);
            painter.drawRect(rect);
            break;
        }
        case 11:
        {
            QRect rect(0, 0, width(), m_nBorder);
            painter.drawRect(rect);
            rect = QRect(0, 0, m_nBorder, height());
            painter.drawRect(rect);
            break;
        }
        case 13:
        {
            QRect rect(0, 0, width(), m_nBorder);
            painter.drawRect(rect);
            rect = QRect(width()-m_nBorder, 0, m_nBorder, height());
            painter.drawRect(rect);
            break;
        }
        case 31:
        {
            QRect rect(0, 0, m_nBorder, height());
            painter.drawRect(rect);
            rect = QRect(0, height()-m_nBorder, width(), m_nBorder);
            painter.drawRect(rect);
            break;
        }
        case 33:
        {
            QRect rect(0, height()-m_nBorder, width(), m_nBorder);
            painter.drawRect(rect);
            rect = QRect(width()-m_nBorder, 0, m_nBorder, height());
            painter.drawRect(rect);
            break;
        }
        default:
            break;
        }
    }
}

void SuperWindow::leaveEvent(QEvent *e)
{
    Q_UNUSED(e);
    m_flag = 22;
}

int SuperWindow::row(QPointF pos)
{
    if (pos.y() < m_nBorder)
        return 10;
    else if (pos.y() > height() - m_nBorder)
        return 30;
    else
        return 20;
}

int SuperWindow::col(QPointF pos)
{
    if (pos.x() < m_nBorder)
        return 1;
    else if (pos.x() > width() - m_nBorder)
        return 3;
    else
        return 2;
}

int SuperWindow::moveArea(QPointF pos)
{
    return row(pos) + col(pos);
}

void SuperWindow::setMouseStyle(int moveArea)
{
    switch (moveArea)
    {
    case 11: setCursor(Qt::SizeFDiagCursor); break;
    case 12: setCursor(Qt::SizeVerCursor); break;
    case 13: setCursor(Qt::SizeBDiagCursor); break;
    case 21: setCursor(Qt::SizeHorCursor); break;
    case 22:
    {
        if (!m_bPressed && !m_bResizing)
            setCursor(Qt::ArrowCursor);
        break;
    }
    case 23: setCursor(Qt::SizeHorCursor); break;
    case 31: setCursor(Qt::SizeBDiagCursor); break;
    case 32: setCursor(Qt::SizeVerCursor); break;
    case 33: setCursor(Qt::SizeFDiagCursor); break;
    default: setCursor(Qt::ArrowCursor); break;
    }
}

void SuperWindow::OnMaxmized()
{
    if (this->isMaximized())
    {
        this->showNormal();
        ui->btnMaxmize->setIcon(QIcon(":/icons/maxsize.png"));
    }
    else
    {
        this->showMaximized();
        ui->btnMaxmize->setIcon(QIcon(":/icons/normal.png"));
    }
}

main.cpp

#include "MainWin.h"
#include "SuperWindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    SuperWindow* win = SuperWindow::Create<MainWin>(nullptr);
    win->show();

    MainWin* mw = win->CentralWidget<MainWin>();
    if (!mw) qDebug() << "not nullptr";
    else mw->setVisible(false);

    return a.exec();
}

对于MainWin的实现,这里就不在放代码了,只要是集成QWidget的窗口即可。

如果我的分享,帮助了您,不要忘记点赞、评论和收藏。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt实战 无边框窗口的实现 的相关文章

  • 从 Qt 更改屏幕分辨率?

    我想更改屏幕分辨率 然后使用一个 ActiveX 控件 Flash 播放器 进入全屏 显然 仅适用于 Windows 的解决方案就可以了 有 Qt api 吗 还是我需要深入研究 winapi 如果是这样 我该在哪里查找 关键字 谢谢您的帮
  • 如何在不同的QT线程中创建一个窗口?

    我有一个应用程序 其中每个线程 主线程除外 都需要创建自己的窗口 我尝试创建一个线程然后调用this gt exec in the run功能 然而 在我接到那个电话之前我就收到了一个错误 ASSERT failure in QWidget
  • cmake 找不到 Qt4

    由于4 8 0已经发布 我重新安装了Qt 现在我也想使用cmake 为了使 cmake 工作 我记得必须添加 mingw bin 文件夹 QtSDK Desktop Qt 4 7 3 到Qt4 7 3中的PATH 所以我猜测在中会有一个类似
  • 如何重写(重新实现)QFileSystemModel 中的成员函数

    我已经为此苦苦挣扎了一段时间 Qt s QFileSystemModel由于图标获取算法非常糟糕 在获取数百个文件时速度非常慢 我想完全禁用图标 它们被提取到QFileSystemModel data方法不是虚拟的 QFileSystemM
  • Qt 和 MOC 的困境与简单的制作

    我想这更像是一个 GNU Make 问题 而不是 Qt 和 moc 但这里是 我有一个包含多个目录Q OBJECTS 我有一些简单的代码 它收集所有这些 例如 MOCS shell grep l Q OBJECT HEADERS Assum
  • 如何通过信号和槽传递参数?

    我的 GUI 包括LineEdit and a 按钮 当 的时候按钮单击后 插槽clicked 叫做 我想在之间建立信号槽关系clicked 作为信号和doSomething 作为插槽 问题是doSomething 无权访问 UI 并且do
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点
  • Qt 码头调整大小事件

    有没有办法在 Qt 中捕捉码头的调整大小事件 我需要能够检测到扩展坞何时调整大小 而不仅仅是其位置或 功能 发生变化时 看起来 QDockWidget 没有 调整大小 信号 如果您不希望子类化以仅获得调整大小事件控件 您可以安装事件过滤器
  • Qmake 不支持源目录下的构建目录

    我创建了一个可以在 OS X 上编译和运行的应用程序 我现在想开始让它在 Windows 上运行 首先 我将项目复制到 Windows 机器上并尝试编译 但收到此错误 警告 Qmake不支持源目录下的构建目录 有任何想法吗 将影子构建目录设
  • 渲染具有透明度的纹理时,OpenGL 不需要的像素

    我已经为这个问题苦苦挣扎了一段时间了 当我使用 OpenGL 渲染 2D 纹理 在无透明度和部分透明度之间的过渡上具有透明度值 时 我得到了一些烦人的灰色像素 我认为这是像素值插值的产物 关于如何改进这一点有什么想法吗 I m attach
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • Qt - 等待 Qprocess 完成

    我正在使用 CMDQProcess但我有一个问题 My code QProcess process process start cmd exe process write del f b txt n r process waitForFin
  • 在未安装 Qt VS Tools 的情况下以 Qt/MsBuild 格式编译 Qt 项目

    我在 Visual Studio 中有很多 Qt 项目 使用新的 Qt MsBuild 格式 https blog qt io blog 2018 02 16 qt visual studio improving performance 由
  • C++:头文件中全局函数的多重定义错误

    该函数是全局的 在头文件中定义 暂时地我想把它留在那里 头文件还构成一个具有内联函数的特定类 其中一个函数调用this全局函数 源文件不包含任何有问题的全局函数 有关错误原因的任何提示吗 如果有人感兴趣的话我可以发布代码 mainwindo
  • 在 4K 屏幕上使用 Matplotlib 和 TKAgg 或 Qt5Agg 后端

    我在 Ubuntu 16 04 上使用 Matplotlib 2 0 和 Python 3 6 来创建数据图 电脑显示器的分辨率为 4k 分辨率为 3840x2160 绘图数字看起来非常小 字体也很小 我已经尝试过TKAgg and Qt5
  • 带 Qt 的菜单栏/系统托盘应用程序

    我是 Qt PyQt 的新手 我正在尝试制作一个应用程序 其功能将从菜单栏 系统托盘执行 这里展示了一个完美的例子 我找不到关于如何做到这一点的好资源 有人可以建议吗 Thanks 我认为您正在寻找与QMenu and QMainWindo
  • QGraphicsScene没有删除QWidget的功能

    QGraphicsScene 有一个addWidget QWidget 有函数 但是没有对应的removeWidget QWidget 它只有removeItem QGraphicsItem 如何删除 QWidget 这是一个基本示例 看看
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不
  • QPainter 性能高帧率

    我试图在 QPainter 中以 60fps 的速度显示视频 在 OpenGLwidget 中 我遇到一个问题 有时绘图花费的时间太长 并且在使用 QPainter 时发生下一个重绘事件 这会生成警告和随机崩溃 有几个问题 是否有一种 Qt
  • 在 Qt 5 中嵌入 Python

    我想将 Python 解释器嵌入到 Qt 5 应用程序中 我在 Qt 5 中有一个工作应用程序 但是当我把 include

随机推荐

  • 安卓手机GPU OpenCL总结

    前段时间 把市面上手机GPU OpenCL支持情况做了一个总结 总结如下 目前 手机 GPU 市面有四个公司产品 Qualcomm Imagination Technologies ARM Vivante 分别对应的产品如下 所有表格均是按
  • Springboot课程试题库管理系统毕业设计源码271129

    Springboot 计算机网络原理 课程试题库管理系统 摘 要 信息化社会内需要与之针对性的信息获取途径 但是途径的扩展基本上为人们所努力的方向 由于站在的角度存在偏差 人们经常能够获得不同类型信息 这也是技术最为难以攻克的课题 针对 计
  • 录制、回放乱码问题解决办法和快照问题解决办法.

    1 录制的脚本乱码 LR录制的脚本中可能会有乱码 主要是当URL中有中文时 通过如下问题可以解决此问题 a Go to Vugen gt Tools gt Recording Options gt Advanced b Check the
  • 失业的程序员(六):加班

    本系列前章 失业的程序员 一 二 三 四 五 一 本文前戏 谈爱 每次开文我总要说一些看起来和本文其实关系不大的啰嗦话 也希望各位观众能够习惯 稍微花费大家几分钟时间便可进入正文 再一次跪求谅解 前几天在家看 我是歌手 复活赛那期 着实震撼
  • 1.开始学习前端(HTML+CSS+JavaScript)学习记录

    1 了解前端 Web开发 对于网页开发 最基础的 最核心的技术就是html css javascript 简称js 这三个技术也被称为前端开发 新三剑客 在Web1 0时代的 网页制作 网页三剑客是指网站的开发工具 Dreamweaver
  • 2009年8月21日

    开通博客了 new Start 1 加了的Active控件Windows Media Player如何能使用快进FastForward 和快退FastForward 这两个功能呢 给控件关联一个control变量 然后调用FastForwa
  • 大数据分析陷阱与Simpson’s Paradox(辛普森悖论)

    在大数据分析时 你有没有遇到这样一种奇怪现象 当分开看数据的时候会得到一种结论 但是合起来之后发现情况却完全改变 这就是著名的辛普森悖论 它总是隐藏在大数据之中 成为大数据分析的陷阱之一 1 含义 辛普森悖论 Simpson s Parad
  • 用C语言进行面向对象编程

    在C语言中进行面向对象编程需要使用一些特定的技术和方法 具体如下 结构体 在C语言中 结构体可以用来表示一个对象的属性和状态 相当于一个类的实例变量 结构体中可以包含不同类型的数据成员 如整数 字符 指针等 函数指针 C语言中可以使用函数指
  • 全局配置Element UI 中的 $message 的显示时长

    首先说下我是全局引入的Element UI组件 这是要更改message 的默认的时长 重写message的方法 import ElementUI from element ui import element ui lib theme ch
  • 修改 el-dialog__body padding

    在dialog外部套个div 再写deep addDia deep el dialog body padding bottom 0
  • angular 路由

    参考 angular 路由 文档 路由案例 路由参数 paramMap和Snapshot 当组件需要复用的时候使用paramMap获取路由参数 如一个组件不刷新 只更改了路由参数 那么就可以实时获取路由参数 当确定组件不复用的时候直接使用S
  • Python turtle画图库&&画姓名

    看一下我定义的change 和run 函数 绘图坐标体系 作用 设置主窗体的大小和位置 turtle setup width height startx starty width 窗口宽度 若值是整数 表示像素值 若是小数 表示窗口宽度与屏
  • 欧拉角万向节锁问题

    欧拉角万向节锁问题 2017 05 28 01 38 465人阅读 评论 0 收藏 举报 分类 计算机图形学 5 版权声明 本文为博主原创文章 未经博主允许不得转载 这两天一直纠结在欧拉角的万向节锁问题上 查了很多资料 可是依旧没有完全弄懂
  • Linux操作系统之僵尸进程

    文章目录 一 什么是僵尸进程 二 僵尸进程带来的危害 三 如何解决僵尸进程 四 什么是孤儿进程 一 什么是僵尸进程 子进程先于父进程节结束 父进程没有调用wait 获取子进程的退出码 子进程此时变为僵尸进程 在每个进程退出时 内核释放所有资
  • 阿里云 linux 的nginx 配置uni-app的H5前端项目vue,后端接口阿里云。

    背景 vue项目调用接口是阿里云的 H5网站也要部署到阿里云 2个不同的服务器 需要做nginx部署与api代理 1 端口配置 首先当然是买个阿里云服务器 这里是配置是linux系统 配置访问的域名 再接着 给网站配置需要的端口 如下 配置
  • 解决Windows系统缺少MCRecvSrc.dll文件的问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个MCRecvS
  • 国外it的一些学习网站

    1 国外有什么好的网站推荐 https blog csdn net AndroidCC article details 55223971 2 一些比较好的国外IT网站 https blog csdn net fzy1017692329 ar
  • Matlab中dir函数使用小技巧

    想必很多小伙伴在matlab中对文件进行批处理时经常会使用dir函数吧 dir函数用于列出文件夹中的内容 使用语法如下 Matlab dir 列出当前文件夹中的文件和文件夹 当然调用方式也可以是listing dir dir name 列出
  • 用JAVA实现停车场管理系统

    该程序使用ArrayList存储停车记录 并通过switch case语句实现菜单选择功能 主要功能包括 停车 输入车牌号和进入时间 自动分配停车位编号 结算 根据停车位编号计算停车费用 计费标准为停车时长 秒 乘以每秒费用0 05元 同时
  • Qt实战 无边框窗口的实现

    本次分享 是基于Qt实现了无边框的窗口 并支持拖动缩放 最大化 最小化 关闭 双击全屏等 实现无边框其实很简单 一行代码搞定 setWindowFlag Qt FramelessWindowHint 但是 隐藏了窗口的默认边框 标题栏没了