Qt颜色选择器(HSV)

2023-11-15

引言

基于Qt实现的HSV颜色选择器,效果如下:
在这里插入图片描述

HSV颜色空间

HSV(Hue, Saturation, Value)是根据颜色的直观特征创建的颜色模型,如下图所示:
在这里插入图片描述
Hue为色调,通过角度表示不同的颜色,取值范围是0°到359°。Saturation为饱和度,取值范围是0到1。Value为明度,表示颜色明暗,值越大越亮,取值范围是0到1。下述实现方案中,饱和度和明度的范围改为0到255。

实现思路

在这里插入图片描述
按照上述模型,实现的关键就是将圆锥的三维投影到二维平面,右侧滑动条表示色调Hue,从0到359。中间画布横坐标表示饱和度Saturation,从0到255,纵坐标表示明度Value,从0到255。滑动条通过修改样式表实现,画布通过paintEvent实现。

代码实现

详细代码如下:

class ColorHueBar : public QWidget
{
    Q_OBJECT

public:
    ColorHueBar(QWidget *parent = nullptr);
    ~ColorHueBar();

    void setValue(int val);
    int value();

signals:
    void sig_valueChanged(int val);

private:
    QSlider* m_slider;
};

class ColorSVCanvas : public QWidget
{
    Q_OBJECT

public:
    ColorSVCanvas(QWidget *parent = nullptr);
    ~ColorSVCanvas();

    bool setHue(int hue);
    bool setSaturationValue(int saturation, int value);
    bool setSaturationValue(QPoint saturationValue);

    QColor color();
    QRect availabilityRect();
    int margin();

signals:
    void sig_colorChanged(const QColor &color);

protected:
    void paintEvent(QPaintEvent* ev) Q_DECL_OVERRIDE;
    void resizeEvent(QResizeEvent* ev) Q_DECL_OVERRIDE;
    bool eventFilter(QObject* obj, QEvent* ev) Q_DECL_OVERRIDE;

private:
    QPoint valueFromPos(QPoint& pos);
    QPoint posFromValue(QPoint& val);

private:
    int m_margin;
    int m_radius;
    int m_saturationMax;
    int m_valueMax;

    int m_hue;
    QPoint m_pos;
};

class ColorChecker : public QWidget
{
    Q_OBJECT

public:
    ColorChecker(QWidget *parent = nullptr);
    ~ColorChecker();

protected:
    void paintEvent(QPaintEvent* ev) Q_DECL_OVERRIDE;

private:
    int m_checkerSize;
};

class ColorAlphaBar : public QWidget
{
    Q_OBJECT

public:
    ColorAlphaBar(QWidget *parent = nullptr);
    ~ColorAlphaBar();

    void setColor(QColor color);
    QColor color();

    void setValue(int alpha);

signals:
    void sig_colorChanged(const QColor &color);

protected:
    void resizeEvent(QResizeEvent* ev) Q_DECL_OVERRIDE;

private:
    ColorChecker* m_checker;
    QSlider* m_slider;
    QColor m_color;

    int m_grooveHeight;
};

class ColorWorkbench : public QDialog
{
    Q_OBJECT

public:
    ColorWorkbench(QWidget *parent = nullptr);
    ~ColorWorkbench();

    void setColor(QColor color);

signals:
    void sig_colorChanged(const QColor &color);

private:
    QColor colorFromStr(QString str);

private slots:
    void slot_colorDisplay(const QColor &color);
    void slot_colorEdit(const QString &text);

private:
    ColorSVCanvas* m_canvas;
    ColorHueBar* m_hsvBar;
    ColorAlphaBar* m_alphaSlider;
    QLineEdit* m_lineEdit;
    QPushButton* m_clearBtn;
    QPushButton* m_confirmBtn;
};

class ColorPicker : public QLabel
{
    Q_OBJECT

public:
    ColorPicker(QWidget *parent = nullptr);
    ~ColorPicker();

protected:
    void resizeEvent(QResizeEvent* ev) Q_DECL_OVERRIDE;

private:
    void setColor(const QColor &color);

private slots:
    void slot_showPopup();
    void slot_colorChanged(const QColor &color);

private:
    QPushButton* m_button;
    ColorChecker* m_checker;
    ColorWorkbench* m_popup;

    QColor m_curColor;
    QColor m_oriColor;
};
ColorHueBar::ColorHueBar(QWidget *parent)
    : QWidget(parent)
{
    m_slider = new QSlider(this);
    m_slider->setMaximum(359);
    m_slider->setFixedWidth(16);
    m_slider->setStyleSheet("QSlider::groove:vertical {width: 12px; \
                                background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, \
                                    stop:0 hsv(0,255,255), \
                                    stop:0.17 hsv(59,255,255), \
                                    stop:0.33 hsv(119,255,255), \
                                    stop:0.5 hsv(179,255,255), \
                                    stop:0.67 hsv(239,255,255), \
                                    stop:0.83 hsv(299,255,255), \
                                    stop:1 hsv(359,255,255));} \
                            QSlider::handle:vertical { \
                                background: white; \
                                height: 4px; \
                                margin:0px -2px; \
                                border: 1px solid grey; \
                                border-radius: 2px;} \
                            QSlider::add-page:vertical {background: transparent;} \
                            QSlider::sub-page:vertical {background: transparent;}");
    setValue(0);
    connect(m_slider, &QSlider::valueChanged, this, [this]{
        emit sig_valueChanged(value());
    });

    auto mainLayout = new QHBoxLayout(this);
    mainLayout->setMargin(0);
    mainLayout->setSpacing(0);
    mainLayout->addWidget(m_slider);
}

ColorHueBar::~ColorHueBar()
{

}

void ColorHueBar::setValue(int val)
{
    m_slider->setValue(qAbs(val - m_slider->maximum()));
}

int ColorHueBar::value()
{
    return qAbs(m_slider->value() - m_slider->maximum());
}

ColorSVCanvas::ColorSVCanvas(QWidget *parent)
    : QWidget(parent)
    , m_margin(5)
    , m_radius(m_margin - 1)
    , m_saturationMax(255)
    , m_valueMax(255)
    , m_hue(0)
    , m_pos(QPoint(-1, -1))
{
    installEventFilter(this);
}

ColorSVCanvas::~ColorSVCanvas()
{

}

bool ColorSVCanvas::setHue(int hue)
{
    if(hue < 0 || hue > 359)
        return false;

    m_hue = hue;

    update();
    emit sig_colorChanged(color());

    return true;
}

bool ColorSVCanvas::setSaturationValue(int saturation, int value)
{
    return setSaturationValue(QPoint(saturation, value));
}

bool ColorSVCanvas::setSaturationValue(QPoint saturationValue)
{
    if(!QRect(0,0,256,256).contains(saturationValue))
        return false;

    m_pos = posFromValue(saturationValue);

    update();
    emit sig_colorChanged(color());

    return true;
}

QColor ColorSVCanvas::color()
{
    QPoint tmpVal = valueFromPos(m_pos);
    QColor tmpColor;
    tmpColor.setHsv(m_hue, tmpVal.x(), tmpVal.y());
    return tmpColor;
}

QRect ColorSVCanvas::availabilityRect()
{
    QRect tmpRect(m_margin, m_margin, width() - m_margin * 2, height() - m_margin * 2);
    return tmpRect;
}

int ColorSVCanvas::margin()
{
    return m_margin;
}

void ColorSVCanvas::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    QRect rect = availabilityRect();

    // 绘制从左到右RGB(255,255,255)到HSV(h,255,255)的渐变
    QLinearGradient linearGradientH(rect.topLeft(), rect.topRight());
    linearGradientH.setColorAt(0, Qt::white);
    QColor color;
    color.setHsv(m_hue, m_saturationMax, m_valueMax);
    linearGradientH.setColorAt(1, color);
    painter.fillRect(rect, linearGradientH);

    // 绘制顶部颜色值为RGBA(0,0,0,0)到最底部RGBA(0,0,0,255)的渐变
    QLinearGradient linearGradientV(rect.topLeft(), rect.bottomLeft());
    linearGradientV.setColorAt(0, QColor(0, 0, 0, 0));
    linearGradientV.setColorAt(1, QColor(0, 0, 0, 255));
    painter.fillRect(rect, linearGradientV);

    painter.setPen(QColor(Qt::darkGray));
    painter.drawEllipse(m_pos, m_radius, m_radius);
}

void ColorSVCanvas::resizeEvent(QResizeEvent *)
{
    if(m_pos == QPoint(-1, -1)){
        setSaturationValue(255, 255);
    }
}

bool ColorSVCanvas::eventFilter(QObject *obj, QEvent *ev)
{
    if(obj == this){
        if(ev->type() == QEvent::MouseButtonPress){
            if(availabilityRect().contains(mapFromGlobal(QCursor::pos()))){
                m_pos = mapFromGlobal(QCursor::pos());
                update();
                emit sig_colorChanged(color());
            }
        }
    }
    return QWidget::eventFilter(obj, ev);
}

QPoint ColorSVCanvas::valueFromPos(QPoint &pos)
{
    QRect tmpRect = availabilityRect();

    QPoint tmpPos = pos - tmpRect.topLeft();
    int saturation = tmpPos.x() * m_saturationMax / tmpRect.width();
    int value = qAbs(tmpPos.y() * m_valueMax / tmpRect.height() - m_valueMax);

    return QPoint(saturation, value);
}

QPoint ColorSVCanvas::posFromValue(QPoint &val)
{
    QRect tmpRect = availabilityRect();

    int tmpX = val.x() * tmpRect.width() / m_saturationMax;
    int tmpY = qAbs(val.y() - m_valueMax) * tmpRect.height() / m_valueMax;

    return QPoint(tmpX, tmpY) + tmpRect.topLeft();
}

ColorChecker::ColorChecker(QWidget *parent)
    : QWidget(parent)
    , m_checkerSize(6)
{

}

ColorChecker::~ColorChecker()
{

}

void ColorChecker::paintEvent(QPaintEvent *ev)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    int rowCount = ev->rect().height() / m_checkerSize + 1;
    int colCount = ev->rect().width() / m_checkerSize + 1;

    for(int i=0; i < rowCount; i++){
        for(int j=0; j < colCount; j++){
            QRect checkerRect(m_checkerSize * j, m_checkerSize * i, m_checkerSize, m_checkerSize);

            QColor checkerColor;
            if(((j + i % 2) % 2) == 0){
                checkerColor = Qt::darkGray;
            }else{
                checkerColor = Qt::white;
            }
            painter.fillRect(checkerRect, checkerColor);
        }
    }
}

ColorAlphaBar::ColorAlphaBar(QWidget *parent)
    : QWidget(parent)
    , m_grooveHeight(12)
{
    m_checker = new ColorChecker(this);

    m_slider = new QSlider(Qt::Horizontal, this);
    m_slider->setMaximum(255);
    m_slider->setValue(m_slider->maximum());
    m_slider->setFixedHeight(16);
    setColor(Qt::red);

    connect(m_slider, &QSlider::valueChanged, this, [this]{
        emit sig_colorChanged(color());
    });

    auto mainLayout = new QVBoxLayout(this);
    mainLayout->setMargin(0);
    mainLayout->setSpacing(0);
    mainLayout->addWidget(m_slider);
}

ColorAlphaBar::~ColorAlphaBar()
{

}

void ColorAlphaBar::setColor(QColor oriColor)
{
    m_color = oriColor;
    m_color.setAlpha(255);

    QColor tmpColor(oriColor);
    tmpColor.setAlpha(0);

    m_slider->setStyleSheet(QString("QSlider::groove:horizontal { \
                                        height: %3px; \
                                        background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, \
                                        stop:0 %1, \
                                        stop:1 %2);} \
                                    QSlider::handle:horizontal { \
                                        background: white; \
                                        width: 4px; \
                                        margin: -2px 0; \
                                        border: 1px solid grey; \
                                        border-radius: 2px;} \
                                    QSlider::add-page:horizontal {background: transparent;} \
                                    QSlider::sub-page:horizontal {background: transparent;}")
                                    .arg(tmpColor.name(QColor::HexArgb))
                                    .arg(m_color.name())
                                    .arg(m_grooveHeight));

    emit sig_colorChanged(color());
}

QColor ColorAlphaBar::color()
{
    QColor tmpColor(m_color);
    tmpColor.setAlpha(m_slider->value());
    return tmpColor;
}

void ColorAlphaBar::setValue(int alpha)
{
    m_slider->setValue(alpha);
}

void ColorAlphaBar::resizeEvent(QResizeEvent *)
{
    m_checker->setGeometry(0, (height() - m_grooveHeight) / 2, width(), m_grooveHeight);
}

ColorWorkbench::ColorWorkbench(QWidget *parent)
    : QDialog(parent, Qt::Popup)
{
    setFixedSize(320, 250);
    setAttribute(Qt::WA_StyledBackground);
    setObjectName("workbench");
    setStyleSheet("#workbench{background-color:white; border:1px solid rgb(245,245,245); border-radius: 6px;}");

    m_canvas = new ColorSVCanvas(this);
    m_canvas->setFixedSize(280, 180);

    m_hsvBar = new ColorHueBar(this);
    m_hsvBar->setFixedHeight(m_canvas->availabilityRect().height());

    m_alphaSlider = new ColorAlphaBar(this);
    m_alphaSlider->setFixedWidth(m_canvas->availabilityRect().width());

    m_lineEdit = new QLineEdit(this);

    m_clearBtn = new QPushButton("clear",this);
    m_clearBtn->setVisible(false);

    m_confirmBtn = new QPushButton("confirm", this);
    connect(m_confirmBtn, &QPushButton::clicked, this, [this]{
        accept();
    });

    connect(m_hsvBar, &ColorHueBar::sig_valueChanged, this, [this](int val){
        m_canvas->setHue(val);
    });
    connect(m_canvas, &ColorSVCanvas::sig_colorChanged, this, [this](const QColor &color){
        m_alphaSlider->setColor(color);
    });
    connect(m_alphaSlider, &ColorAlphaBar::sig_colorChanged, this, &ColorWorkbench::slot_colorDisplay);
    connect(m_lineEdit, &QLineEdit::textEdited, this, &ColorWorkbench::slot_colorEdit);

    // 布局
    auto handleLayout = new QHBoxLayout;
    handleLayout->addSpacing(m_canvas->margin());
    handleLayout->addWidget(m_lineEdit);
    handleLayout->addStretch();
    handleLayout->addWidget(m_clearBtn);
    handleLayout->addWidget(m_confirmBtn);

    auto alphaLayout = new QHBoxLayout;
    alphaLayout->setMargin(0);
    alphaLayout->addSpacing(m_canvas->margin());
    alphaLayout->addWidget(m_alphaSlider);

    auto mainLayout = new QGridLayout(this);
    mainLayout->addWidget(m_canvas, 0, 0);
    mainLayout->addWidget(m_hsvBar, 0, 1);
    mainLayout->addLayout(alphaLayout, 1, 0);
    mainLayout->addLayout(handleLayout, 2, 0, 1, 2);
}

ColorWorkbench::~ColorWorkbench()
{

}

void ColorWorkbench::setColor(QColor color)
{
    m_hsvBar->setValue(color.hsvHue());
    m_canvas->setSaturationValue(color.hsvSaturation(), color.value());
    m_alphaSlider->setValue(color.alpha());
}

QColor ColorWorkbench::colorFromStr(QString str)
{
    QColor color(str);
    if(!color.isValid()){
        QString tmpStr = str;
        QRegExp rx("[^\\d+^,^.]");
        if(str.contains(rx)){
            tmpStr.remove(rx);
        }
        if(!tmpStr.isEmpty()){
            QStringList strList = tmpStr.split(",");
            if(str.contains("rgba") && strList.count() == 4){
                color.setRgb(strList.at(0).toInt(), strList.at(1).toInt(), strList.at(2).toInt());
                if(strList.at(3).toDouble()>1){
                    color.setAlpha(strList.at(3).toInt());
                }else{
                    color.setAlphaF(strList.at(3).toDouble());
                }
            }
            else if(str.contains("rgb") && strList.count() == 3){
                color.setRgb(strList.at(0).toInt(), strList.at(1).toInt(), strList.at(2).toInt());
            }
            else if(str.contains("hsv") && strList.count() == 3){
                color.setHsv(strList.at(0).toInt(), strList.at(1).toInt(), strList.at(2).toInt());
            }
        }
    }

    return color;
}

void ColorWorkbench::slot_colorDisplay(const QColor& color)
{
    QRegExp reg("(\\.){0,1}0+$");// 去除末尾0
    m_lineEdit->setText(QString("rgba(%1, %2, %3, %4)")
                        .arg(color.red())
                        .arg(color.green())
                        .arg(color.blue())
                        .arg(QString::number(color.alphaF(), 'f', 2).replace(reg, "")));

    emit sig_colorChanged(color);
}

void ColorWorkbench::slot_colorEdit(const QString &text)
{
    QColor color = colorFromStr(text);
    if(color.isValid()){
        disconnect(m_alphaSlider, &ColorAlphaBar::sig_colorChanged, this, &ColorWorkbench::slot_colorDisplay);
        setColor(color);
        connect(m_alphaSlider, &ColorAlphaBar::sig_colorChanged, this, &ColorWorkbench::slot_colorDisplay);

        emit sig_colorChanged(color);
    }
}

ColorPicker::ColorPicker(QWidget *parent)
    : QLabel(parent)
{
    m_checker = new ColorChecker(this);

    m_popup = new ColorWorkbench(this);
    connect(m_popup, &ColorWorkbench::sig_colorChanged, this, &ColorPicker::slot_colorChanged);
    connect(m_popup, &QDialog::finished, this, [this](int result){
        if(result == QDialog::Accepted){
            m_oriColor = m_curColor;
        }
        else{
            setColor(m_oriColor);
        }
    });

    m_button = new QPushButton("v", this);
    m_button->setFixedSize(30, 30);
    connect(m_button, &QPushButton::pressed, this, &ColorPicker::slot_showPopup);

    setFixedSize(40, 40);
    setStyleSheet(QString("QLabel{border:1px solid %1; border-radius: 4px; background-color: %2;}")
                  .arg(QColor(230, 230, 230).name())
                  .arg(QColor(Qt::white).name()));
    setColor(QColor(255,0,0,150));

    auto mainLayout = new QHBoxLayout(this);
    mainLayout->setMargin(0);
    mainLayout->addWidget(m_button);
}

ColorPicker::~ColorPicker()
{

}

void ColorPicker::resizeEvent(QResizeEvent *)
{
    m_checker->setGeometry(m_button->geometry());
}

void ColorPicker::setColor(const QColor &color)
{
    m_curColor = color;
    m_button->setStyleSheet(QString("QPushButton{border:1px solid %1; background-color:%2}")
                            .arg(QColor(152,152,152).name())
                            .arg(color.name(QColor::HexArgb)));
}

void ColorPicker::slot_showPopup()
{
    m_oriColor = m_curColor;
    m_popup->setColor(m_oriColor);

    QPoint tmpPos = mapToGlobal(m_button->geometry().center());
    tmpPos += QPoint(-m_popup->width() / 2, m_button->height() / 2 + 5);
    m_popup->move(tmpPos);

    m_popup->open();
}

void ColorPicker::slot_colorChanged(const QColor &color)
{
    if (m_popup->isVisible()) {
        setColor(color);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt颜色选择器(HSV) 的相关文章

  • 从 PDF 转换为 HTML [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 ITextSharp 从内存流附加 PDF 文件时遇到问题

    我在附加内存中创建的 PDF 文件并将其附加到电子邮件模板时遇到问题 电子邮件没有任何问题 但没有附件 我不明白为什么会发生这种情况 这是该过程的完整代码 ExtendedEmailTemplate emailTemp new Extend
  • C# - 带 GUI 的后台应用程序

    我的问题是我想创建一个后台应用程序 但具有可以恢复并最小化到系统托盘的用户界面 并且它从窗口启动 我尝试搜索如何启动 但只找到有关 Windows 服务的线程 没有 UI 或创建表单并隐藏它 所以我的问题是我应该如何开始 Windows 窗
  • crt0 是否加载 msvcrt.dll?

    我想弄清楚标准 C 函数是什么样的printf 在 Windows 环境下加载到内存中 我知道crt0 obj准备堆栈 调用int main int argc char argv 然后使用 main 返回的退出代码退出进程 我还听说 C 标
  • 如何获取列表框中项目的索引?

    我正在将项目添加到ListBox像这样 myListBox Items addRange myObjectArray 我还想通过以下方式选择我添加的一些项目 foreach MyObject m in otherListOfMyObject
  • 从列表中获取数组而不进行堆分配

    我有一个列表 我想将其数组分配给一个属性 public void BuildMesh List
  • 为什么Java不支持C中的clrscr这样的函数?

    我有一个问题 对很多人来说可能听起来很愚蠢 但我不能停下来把它发布在这里 因为在互联网上找不到任何东西 为什么java没有我们在C中使用的clrscr之类的函数 如果我创建了一个基于用户输入反复迭代的 java 控制台应用程序 然后如果我想
  • 调试器 StepInto 自动生成的代码和 JMC 问题

    我正在使用 MDBG 示例制作托管 NET 调试器 目前 我正在努力解决 StepInto 行为 而 StepOut 和 StepOver 似乎有效 实现Just My Code迈步我在呼唤SetJMCStatus在模块加载时 这工作得很好
  • 如何将多种语言设置放入单个 .clang-format 文件中

    我想为 java javascript 和 c 创建一个 clang 格式 我知道如何转储单一语言的示例配置 但不知道如何合并这 3 个配置文件 有关如何将多种语言配置放入单个文件中的示例 BasedOnStyle LLVM IndentW
  • 如何在 Mac OS X 中获取 aio 信号处理程序的用户数据

    我尝试在 Mac OS X 下使用 aio 函数进行异步文件 IO 但在将某种形式的用户数据输入信号处理程序时遇到问题 这是设置操作的代码 class aio context public aio context int fildes bo
  • .NET 4.0 进程中的 clr.dll!LogHelp_TerminateOnAssert

    背景 我正在开发一个基于 WinForm 的 NET 4 0 桌面应用程序 该应用程序几乎没有线程和计时器 并对用户控件使用一些 GDI 处理 在我的开发过程中 我通常会查看 sysinternal 的 Process Explorer 以
  • 通过模板参数向类添加方法

    我希望在类中拥有一个模板参数特定函数 取消启用enable if 它的名称保持不变 参数类型有所不同 尽管这应该不相关 因为只有一个被初始化 enum class MyCases CASE1 CASE2 template
  • FileMode 和 FileAccess 以及 IOException:进程无法访问文件“filename”,因为它正在被另一个进程使用

    我有一个应用程序 A 它生成一个用于跟踪的文本文件 同时 应用程序 B 需要读取相同的文本文件并附加在邮件消息中 但当应用程序 B 尝试读取文本文件时 出现以下错误 IOException 进程无法访问文件 filename 因为它 正在被
  • WebProxy 错误:需要代理身份验证

    我使用以下代码从互联网获取html数据 WebProxy p new WebProxy localproxyIP 8080 true p Credentials new NetworkCredential domain user passw
  • 为什么%c前面需要加空格? [复制]

    这个问题在这里已经有答案了 下面的代码一编译就给出了奇怪的o p main char name 3 float price 3 int pages 3 i printf nEnter names prices and no of pages
  • UWP 关闭信息亭模式

    我有一个发布到 Windows 应用商店的 UWP 应用程序 并且该应用程序可以启动进入信息亭模式 分配访问权限 它工作得很好 但我尝试在应用程序上创建一个按钮来关闭信息亭模式并返回到 Windows 登录屏幕 我尝试了文档中给出的代码 h
  • 使用 DI 将参数传递给 DbContext

    我想向 DBContext 传递一个附加参数 如下所示 string myParam xx string con connenctionstring services AddDbContext
  • C++中main函数可以调用自身吗?

    谁能告诉我下面的代码有什么问题吗 int main return main 我测试了一下 编译正确 它永远运行 幕后还有什么阴谋吗 TLDR 呼叫main导致未定义的行为 标准中使用的术语以及对程序员和编译器的影响似乎存在混淆 首先 单独的
  • 编译Linux内核模块时出现错误:“CONFIG_X86_X32已启用,但没有binutils支持”和不需要的“n”字符

    我想得到Rasta Ring0 调试器 http rr0d droids corp org 在我的 x86 64 Linux 中编译的 0 3 版本 它是一个 Linux 内核模块 我已将 32 位内联汇编替换为 64 位汇编 如我的问题中
  • 用 C# 解析和查询 SOAP

    我正在尝试解析一个大量命名空间的 SOAP 消息 源也可以在here http tinyurl com n3av6k

随机推荐

  • Python-heapq堆

    1 堆介绍 堆是非线性的树形的数据结构 有两种堆 最大堆与最小堆 heapq库中的堆默认是最小堆 最大堆 树种各个父节点的值总是大于或等于任何一个子节点的值 最小堆 树种各个父节点的值总是小于或等于任何一个子节点的值 我们一般使用二叉堆来实
  • c++的多态和虚函数

    c 的多态和虚函数 什么是多态 虚函数在多态中的运用 静态关联和动态关联 什么情况下声明虚函数 虚折构函数 纯虚函数 什么是多态 直观的说 就是向不同的对象发送一个消息 不同的对象在接收消息以后有不同的行为 函数重载和运算符重载都是多态现象
  • MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • 【云原生之Docker实战】使用Docker部署jpress开源网站

    云原生之Docker实战 使用Docker部署jpress开源网站 一 jpress介绍 1 jpress简介 2 jpress功能 二 检查本地docker环境 1 检查docker版本 2 检查系统版本 3 检查docker状态 三 安
  • poll,epoll,select,poll与epoll的区别,LT模式与ET模式的区别

    文章目录 一 poll poll与select的区别 二 epoll select poll 与epoll的区别 LT模式与ET模式的区别 一 poll 以下图片来自Liunx高性能服务器编程 poll与select的区别 poll是个加强
  • 服务器u.2接口固态硬盘,固态硬盘的U.2接口为何物

    U 2接口我相信大家听到的次数肯定远远不如SATA MSATA M 2 PCIE这些接口 U 2即然被发明 为何一直没有真正的在市场上 扬名立万 呢 最重要的还是缺乏配套的主板资源 U 2原名叫SFF 8639 如果光听这个代号 估计没有多
  • 2022最新秋招+社招Android面试题汇总+解析(内含字节、网易等大厂面经)

    前言 目前的就业形式可以分为校招和社招两大战场 无形的竞争相当于是一场没有硝烟的厮杀 人才饱和的结果当然就是一阵阵卷麻了的哀嚎 不过 大家既然选择了Android 自然就得做好迎战的准备 最近一两个月 陆陆续续的秋招面经都出来了 但是在网上
  • 2020年全国平均工资出炉:IT行业超17万居首!网友:又是拖后腿的那个~

    2020年全国平均工资出炉了 2020年全国城镇非私营单位就业人员年平均工资为97379元 2020年全国城镇私营单位就业人员年平均工资为57727元 前三甲依次是信息传输 软件和信息技术服务业177544元 其次是科学研究和技术服务业13
  • codeblocks创建和使用静态库(C语言)

    静态库 扩展名为 a 或 lib 是包含函数的文件 用于在link阶段整合执行程序 动态链接库 扩展名 dll 是不在link阶段整合进执行程序中的 DLL文件在执行阶段动态调用 下面我们将用免费的开发工具CodeBocks开发静态库 创建
  • 【C++】在线IDE

    1 洛谷在线IDE https www luogu com cn ide 2 菜鸟工具 https c runoob com compile 12 3 Cloud Studio https cloudstudio net
  • 使用STM32CubeMX生成源码工程后,使用ST-LINK下载出现问题的解决方法

    第一次使用STM32CubeMX生成源码工程文件 各种时钟引脚资源配置好后 点击生成了Keil的工程 编译通过 连接ST LINK下载程序 第一次下载 一切正常 然后修改了一下程序 再次下载 出现找不到设备的提示 以为板子出了问题 又拿过来
  • Python 数组(Arrays)

    数组 Array 是有序的元素序列 若将有限个类型相同的变量的集合命名 那么这个名称为数组名 组成数组的各个变量称为数组的分量 也称为数组的元素 有时也称为下标变量 用于区分数组的各个元素的数字编号称为下标 数组是在程序设计中 为了处理方便
  • 为什么db是先写日志,而redis是后写日志

    预写式日志 Write Ahead Logging WAL 基本上所有的数据库都实现了这个WAL技术 来保证原子性和持久性 WAL的核心思想是 在数据写入到数据库之前 先写入到日志 这一定程度上也可以提高效率 因为不需要每次都和磁盘交互 可
  • 各种开源应用的实践经验

    在实际的项目中 很多地方需要用到开源项目 而现在的开源项目太多 从开源项目的首页去看的话 也未必能得到足够充分的信息 多数时候是选用淘汰法 选剩下两到三个项目然后自己再去一个一个地去试用 选择合适的开源组件确实是一件麻烦事 本文将记录下选择
  • Arthas 定位CPU跑满问题,源头竟是Apache Beanutils

    一 背景 大早上 线上k8s 机子 某个机子 cpu 飙高 导致k8s 健康检查失败 线上环境会自动执行jstack 上传到oss 通知到 钉钉告警群 直接分析锁 cpu 高的线程 二 过程分析 2 1 排查cpu 占用最高的线程 使用js
  • JAVA-0基础学习笔记-day01

    0基础学Java笔记day01 01 01 计算机基础知识 计算机概述 了解 A 什么是计算机 计算机在生活中的应用举例 计算机 Computer 全称 电子计算机 俗称电脑 是一种能够按照程序运行 自动 高速处理海量数据的现代化智能电子设
  • Java经典面试题 带答案(五)

    Java经典面试题 带答案 五 Java 面试笔试题汇总 一 编程语言 Java 2 二 软件工程方面 9 三 智力测试 9 四 数据库 12 五 Java框架方面 14 六 XML方面 17 七 网络基础方面 17 八 算法方面 19 1
  • eclispe黑色配色方案,插件配置

    http blog csdn net zhwangkaixuan article details 9303359 使用android官方的ADT感觉界面白色的太怪了 看就了眼睛不舒服 上网找了一个eclispe的插件可以定制编辑器的配色方案
  • Docker学习笔记05-----镜像仓库之官方Docker Hub

    官方Docker Hub https hub docker com 1 创建Repository 2 构建容器镜像 2 1 创建Dockerfile FROM java 8 MAINTAINER itmrl LABEL name hello
  • Qt颜色选择器(HSV)

    目录 引言 HSV颜色空间 实现思路 代码实现 引言 基于Qt实现的HSV颜色选择器 效果如下 HSV颜色空间 HSV Hue Saturation Value 是根据颜色的直观特征创建的颜色模型 如下图所示 Hue为色调 通过角度表示不同