QT 进度条、滑动条、调色板、取色器

QT 进度条、滑动条、调色板、取色器

一、简述

       记--QT 进度条、滑动条简单的使用例子,调色板练习。

       例子1:链接: https://pan.baidu.com/s/1NBv2-ptbcOEB3IYhBeCguQ 提取码: b86q 

       例子2:链接: https://pan.baidu.com/s/1RDsbQ9agAVJYPnWCabEBug 提取码: 66he

二、例子1 进度条例子

         2.1  效果:

                 

        2.2  工程结构:

                  

                  布局:

                 

         2.3  源文件

    ProgressDemo.pro文件

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = ProgressDemo
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

    mainwindow.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_horizontalSlider_valueChanged(int value);

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

    main.cpp文件

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

    mainwindow.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //ui->progressBar->setMinimum(0);//设置进度条的最小值
    //ui->progressBar->setMaximum(100);//设置进度条的最大值
    ui->progressBar->setValue(0);//设置进度条的当前值

    ui->horizontalSlider->setMinimum(0);//设置水平滑动条的最小值
    ui->horizontalSlider->setMaximum(100);//设置水平滑动条的最大值
    ui->horizontalSlider->setValue(0);//设置水平滑动条的当前值

}

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

void MainWindow::on_horizontalSlider_valueChanged(int value)//当滑动条的值改变时 执行此槽函数
{
    //value是滑动条的值,也可以这样获取int value = ui->horizontalSlider->value();//获取水平滑动条的值
    ui->progressBar->setValue(value);//设置进度条的值
}

三、例子2 滑动条例子---调色板

         3.1 效果

          取色器:鼠标左键或右键单击,取色完成。         

         3.2 工程结构

               

                布局:

                 

         3.3 源文件

              SliderDemo.pro文件

QT       += core gui
RC_ICONS += img/palette.ico

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = SliderDemo
TEMPLATE = app



SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

RESOURCES += \
    res.qrc

              mainwindow.h文件     

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

    int m_r;//红色的值
    int m_g;//绿色的值
    int m_b;//蓝色的值
    QPixmap m_pixmap;//全屏截图,截图频繁会单只鼠标卡顿

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    bool m_isPicColor;//指示当前是否进行屏幕取色
    void setColor();//设置颜色
    static void PickupColor(int x, int y);//获取鼠标位置的1个像素 x和y是鼠标的位置
    static MainWindow* st_this;//静态的对象指针,用来设置成员值(设置颜色)

private slots://槽函数
    void on_horizontalSliderR_valueChanged(int value);//红色滑动条的值改变了就会调用

    void on_horizontalSliderG_valueChanged(int value);//绿色滑动条的值改变了就会调用

    void on_horizontalSliderB_valueChanged(int value);//蓝色滑动条的值改变了就会调用

    void on_btnEditColor_clicked();//编辑颜色 按钮 的响应函数

    void on_spinBoxR_valueChanged(int value);//红色spinBox数值微调框的值改变了就会调用

    void on_spinBoxG_valueChanged(int value);//绿色spinBox数值微调框的值改变了就会调用

    void on_spinBoxB_valueChanged(int value);//蓝色spinBox数值微调框的值改变了就会调用

    void on_btnPickupColor_clicked();//取色

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

              main.cpp文件

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

              mainwindow.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QColorDialog>//颜色对话框
#include <QMouseEvent>//鼠标事件
#include <QPoint>//点(坐标位置)
#include <QDebug>
#include <QScreen>
#include <Windows.h>

MainWindow* MainWindow::st_this = nullptr;//初始化静态指针

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setFixedSize(this->width(), this->height());//固定窗口大小

    st_this = this;
    m_r = 255;//初始化颜色值
    m_g = 255;
    m_b = 255;
    this->setWindowIcon(QIcon(":/images/img/palette.ico"));//设置可执行程序图标
    ui->centralWidget->setMouseTracking(true);//开启鼠标实时追踪,用来实时的获取鼠标的位置
    setMouseTracking(true);//开启鼠标实时追踪,为了节省资源默认状态下是要鼠标按下才捕捉
    m_isPicColor = false;
}

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

void MainWindow::setColor()//设置颜色
{
    //设置label的颜色
    QString style = QString("background-color: rgb(%1, %2, %3);").arg(m_r).arg(m_g).arg(m_b);
    ui->labelColor->setStyleSheet(style);

    //获取RGB十六进制形式
    QString strRHex = QString::number(m_r, 16).toUpper();//将r的十六进制形式 转为字符串形式(大写)
    QString strGHex = QString::number(m_g, 16).toUpper();
    QString strBHex = QString::number(m_b, 16).toUpper();

    //设置Hex这一列标签
    ui->labelRHex->setText("0x" + strRHex);
    ui->labelGHex->setText("0x" + strGHex);
    ui->labelBHex->setText("0x" + strBHex);

    //将颜色值设置到lineEdit,可以直接复制颜色值
    ui->lineEditColorValue->setText(QString("RGB(%1,%2,%3),HEX(0x%4%5%6)").arg(m_r).arg(m_g).arg(m_b).arg(strRHex).arg(strGHex).arg(strBHex));
}

void MainWindow::on_horizontalSliderR_valueChanged(int value)//滑动条的值发生变化时执行
{
    m_r = value;
    ui->spinBoxR->setValue(m_r);//同步更新设置spinBox数值微调框
    setColor();
}

void MainWindow::on_horizontalSliderG_valueChanged(int value)
{
    m_g = value;
    ui->spinBoxG->setValue(m_g);//同步更新设置spinBox数值微调框
    setColor();
}

void MainWindow::on_horizontalSliderB_valueChanged(int value)
{
    m_b = value;
    ui->spinBoxB->setValue(m_b);//同步更新设置spinBox数值微调框
    setColor();
}

void MainWindow::on_btnEditColor_clicked()//编辑颜色按钮
{
    QColor color =  QColorDialog::getColor(Qt::white, this, "请选择颜色");//打开颜色对话框
    ui->horizontalSliderR->setValue(color.red());//设置红色滑动条的值
    ui->horizontalSliderG->setValue(color.green());//设置绿色滑动条的值
    ui->horizontalSliderB->setValue(color.blue());//设置蓝色滑动条的值
}

void MainWindow::on_spinBoxR_valueChanged(int value)//数值微调控件的值发生变化时执行
{
    ui->horizontalSliderR->setValue(value);//同步更新滑动条的值,这里不用调用setColor(),滑动条的值改变了就会调用,并设置m_r,m_g,m_b
}

void MainWindow::on_spinBoxG_valueChanged(int value)
{
    ui->horizontalSliderG->setValue(value);//同步更新滑动条的值,这里不用调用setColor,滑动条的值改变了就会调用
}

void MainWindow::on_spinBoxB_valueChanged(int value)
{
    ui->horizontalSliderB->setValue(value);//同步更新滑动条的值,这里不用调用setColor,滑动条的值改变了就会调用
}

void MainWindow::PickupColor(int x, int y)//获取鼠标位置的1个像素 x和y是鼠标的位置
{
    QRgb rgb = MainWindow::st_this->m_pixmap.toImage().pixel(x, y);//获取Pixmap指定位置的像素的rgb数据,这个Pixmap只有一个像素,其实获取的就是鼠标位置的像素

    //设置label的颜色
    QString style = QString("background-color: rgb(%1, %2, %3);").arg(qRed(rgb)).arg(qGreen(rgb)).arg(qBlue(rgb));
    MainWindow::st_this->ui->labelColor->setStyleSheet(style);
    if(!MainWindow::st_this->m_isPicColor)//取色结束才调整控件,不然可能导致鼠标卡顿
    {
        MainWindow::st_this->on_horizontalSliderR_valueChanged( qRed(rgb) );
        MainWindow::st_this->on_horizontalSliderG_valueChanged( qGreen(rgb) );
        MainWindow::st_this->on_horizontalSliderB_valueChanged( qBlue(rgb) );
    }

}

//实现在窗口之外也能捕获鼠标
HHOOK mouseHook = NULL;//鼠标钩子
LRESULT CALLBACK mouseProc(int nCode,WPARAM wParam,LPARAM lParam )
{
    if(nCode == HC_ACTION) //当nCode等于HC_ACTION时,lParam参数是指向EVENTMSG结构的指针,该结构包含有关从系统队列中删除的消息的信息
    {
        MSLLHOOKSTRUCT *mouse = (MSLLHOOKSTRUCT *) lParam;//鼠标相关信息
        //相关类型在winuser.h
        if(wParam == WM_MOUSEMOVE)//鼠标移动
        {
            MainWindow::PickupColor(mouse->pt.x, mouse->pt.y);//移动显示当前取到的颜色
            //return false;//返回false,继续分发事件。返回真,即屏蔽掉这些事件,鼠标操作受到限制

        }//鼠标右键按下 或 鼠标左键按下 取色完成
        else if(wParam == WM_RBUTTONDOWN || wParam == WM_LBUTTONDOWN)
        {
            //卸载鼠标钩子
            UnhookWindowsHookEx(mouseHook);

            MainWindow::st_this->m_isPicColor = false;//取色结束
            MainWindow::PickupColor(mouse->pt.x, mouse->pt.y);//设置最后取色,包括滑动条控件的值
        }
    }
    return CallNextHookEx(mouseHook,nCode,wParam,lParam);//否则,如果返回给下一个钩子子程处理
}

void MainWindow::on_btnPickupColor_clicked()//拾取颜色(屏幕取色)
{
    if(!m_isPicColor)//准备捕获全局鼠标动作,开启屏幕取色
    {
        //注册鼠标钩子
        mouseHook = SetWindowsHookEx( WH_MOUSE_LL,mouseProc,GetModuleHandle(NULL),0);
    }
    m_isPicColor = true;//进行屏幕取色

    //截取全屏图像
    QScreen *screen = QGuiApplication::primaryScreen();
    m_pixmap = screen->grabWindow(0);//0代表桌面
    qDebug()<<"开启屏幕取色";
}

四、总结

        4.1 设置应用图标

               4.1.1  准备.ico文件, 并添加到资源文件。

                   

                4.1.2  在.pro文件添加:RC_ICONS += img/palette.ico     (注意实际的路径)

                        

                4.1.3 设置图标

                  方式1:代码方式设置:

this->setWindowIcon(QIcon(":/images/img/palette.ico"));//设置可执行程序图标

                方式2:在属性栏中直接设置

           

 

  4.2 监测全局鼠标事件(HOOK方式)

//实现在窗口之外也能捕获鼠标         头文件Windows.h
HHOOK mouseHook = NULL;//鼠标钩子
LRESULT CALLBACK mouseProc(int nCode,WPARAM wParam,LPARAM lParam )
{
    if(nCode == HC_ACTION) //当nCode等于HC_ACTION时,lParam参数是指向EVENTMSG结构的指针,该结构包含有关从系统队列中删除的消息的信息
    {
        MSLLHOOKSTRUCT *mouse = (MSLLHOOKSTRUCT *) lParam;//鼠标相关信息
        //相关类型在winuser.h
        if(wParam == WM_MOUSEMOVE)//鼠标移动
        {
            MainWindow::PickupColor(mouse->pt.x, mouse->pt.y);//移动显示当前取到的颜色
            //return false;//返回false,继续分发事件。返回真,即屏蔽掉这些事件,鼠标操作受到限制

        }//鼠标右键按下 或 鼠标左键按下 取色完成
        else if(wParam == WM_RBUTTONDOWN || wParam == WM_LBUTTONDOWN)
        {
            //卸载鼠标钩子
            UnhookWindowsHookEx(mouseHook);

            MainWindow::st_this->m_isPicColor = false;//取色结束
            MainWindow::PickupColor(mouse->pt.x, mouse->pt.y);//设置最后取色,包括滑动条控件的值
        }
    }
    return CallNextHookEx(mouseHook,nCode,wParam,lParam);//否则,如果返回给下一个钩子子程处理
}

 4.3 实现取色器:取鼠标位置的像素信息

        取鼠标位置的像素信息==》取全屏图片的指定位置像素的rgb信息 (鼠标的位置==》指定的位置)

QRgb rgb = m_pixmap.toImage().pixel(x, y);//获取Pixmap指定位置的像素的rgb数据,这个Pixmap只有一个像素,其实获取的就是鼠标位置的像素

       截全屏幕的图片

QScreen *screen = QGuiApplication::primaryScreen();
m_pixmap = screen->grabWindow(0);//0代表桌面

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值