Qt5开发学习之调色板与各种工具类(五)

工具盒类

QToolBox类称为称为工具盒类,QToolBox提供一种列状的层叠窗体。QToolButton提供了一种快速访问命令或选择项的按钮,通常在工具条中使用。抽屉效果是软件界面中一种常用形式,可以以一种直观的方式在有限大小的界面上扩展出更多的功能。
使用QToolBox类实现一个类似QQ聊天界面的抽屉效:
myqq.h:

#include <QToolBox>
#include <QToolButton>

class MyQQ : public QToolBox
{
    Q_OBJECT

public:
    MyQQ(QWidget *parent = 0);
    ~MyQQ();

private:
    QToolButton *toolBtn1_1;
    QToolButton *toolBtn1_2;
    QToolButton *toolBtn1_3;
    QToolButton *toolBtn1_4;
    QToolButton *toolBtn1_5;
    QToolButton *toolBtn2_1;
    QToolButton *toolBtn2_2;
    QToolButton *toolBtn3_1;
    QToolButton *toolBtn3_2;

};

myqq.cpp:

#include "myqq.h"
#include <QGroupBox>
#include <QVBoxLayout>

MyQQ::MyQQ(QWidget *parent)
    : QToolBox(parent)
{
    setWindowTitle(tr("My QQ"));
    this->resize(200, 800);

    toolBtn1_1 = new QToolButton;
    toolBtn1_1->setText(tr("11"));
    // 加载显示头像的图片,位置在构建之后产生的Debug文件目录下
    toolBtn1_1->setIcon(QPixmap("11.jpg"));
    // 设定按钮显示大小为图片大小
    toolBtn1_1->setIconSize(QPixmap("11.jpg").size());
    // 设置图片自动弹起
    toolBtn1_1->setAutoRaise(true);
    // 设置头像图片旁边显示名字
    toolBtn1_1->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

    toolBtn1_2 = new QToolButton;
    toolBtn1_2->setText(tr("12"));
    toolBtn1_2->setIcon(QPixmap("12.jpg"));
    toolBtn1_2->setIconSize(QPixmap("12.jpg").size());
    toolBtn1_2->setAutoRaise(true);
    toolBtn1_2->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

    toolBtn1_3 = new QToolButton;
    toolBtn1_3->setText(tr("13"));
    toolBtn1_3->setIcon(QPixmap("13.jpg"));
    toolBtn1_3->setIconSize(QPixmap("13.jpg").size());
    toolBtn1_3->setAutoRaise(true);
    toolBtn1_3->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

    toolBtn1_4 = new QToolButton;
    toolBtn1_4->setText(tr("14"));
    toolBtn1_4->setIcon(QPixmap("14.jpg"));
    toolBtn1_4->setIconSize(QPixmap("14.jpg").size());
    toolBtn1_4->setAutoRaise(true);
    toolBtn1_4->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

    toolBtn1_5 = new QToolButton;
    toolBtn1_5->setText(tr("15"));
    toolBtn1_5->setIcon(QPixmap("15.jpg"));
    toolBtn1_5->setIconSize(QPixmap("15.jpg").size());
    toolBtn1_5->setAutoRaise(true);
    toolBtn1_5->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

    // 设置一个QGroupBox实例,对应一个抽屉
    QGroupBox *groupBox1 = new QGroupBox;
    // 设置抽屉内的布局
    QVBoxLayout *layout1 = new QVBoxLayout(groupBox1);
    layout1->setMargin(10);
    // 设置布局中各窗体显示的位置
    layout1->setAlignment(Qt::AlignHCenter);
    // 布局中插入头像控件
    layout1->addWidget(toolBtn1_1);
    layout1->addWidget(toolBtn1_2);
    layout1->addWidget(toolBtn1_3);
    layout1->addWidget(toolBtn1_4);
    layout1->addWidget(toolBtn1_5);
    // 插入一个占位符,使得所有按钮能够向上对齐
    layout1->addStretch();

    toolBtn2_1 = new QToolButton;
    toolBtn2_1->setText(tr("21"));
    toolBtn2_1->setIcon(QPixmap("21.jpg"));
    toolBtn2_1->setIconSize(QPixmap("21.jpg").size());
    toolBtn2_1->setAutoRaise(true);
    toolBtn2_1->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

    toolBtn2_2 = new QToolButton;
    toolBtn2_2->setText(tr("22"));
    toolBtn2_2->setIcon(QPixmap("22.jpg"));
    toolBtn2_2->setIconSize(QPixmap("22.jpg").size());
    toolBtn2_2->setAutoRaise(true);
    toolBtn2_2->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

    QGroupBox *groupBox2 = new QGroupBox;
    QVBoxLayout *layout2 = new QVBoxLayout(groupBox2);
    layout2->setMargin(10);
    layout2->setAlignment(Qt::AlignHCenter);
    layout2->addWidget(toolBtn2_1);
    layout2->addWidget(toolBtn2_2);

    toolBtn3_1 = new QToolButton;
    toolBtn3_1->setText(tr("31"));
    toolBtn3_1->setIcon(QPixmap("31.jpg"));
    toolBtn3_1->setIconSize(QPixmap("31.jpg").size());
    toolBtn3_1->setAutoRaise(true);
    toolBtn3_1->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

    toolBtn3_2 = new QToolButton;
    toolBtn3_2->setText(tr("32"));
    toolBtn3_2->setIcon(QPixmap("32.jpg"));
    toolBtn3_2->setIconSize(QPixmap("32.jpg").size());
    toolBtn3_2->setAutoRaise(true);
    toolBtn3_2->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

    QGroupBox *groupBox3 = new QGroupBox;
    QVBoxLayout *layout3 = new QVBoxLayout(groupBox3);
    layout3->setMargin(10);
    layout3->setAlignment(Qt::AlignHCenter);
    layout3->addWidget(toolBtn3_1);
    layout3->addWidget(toolBtn3_2);

    this->addItem((QWidget*)groupBox1, tr("我的好友"));
    this->addItem((QWidget*)groupBox2, tr("陌生人"));
    this->addItem((QWidget*)groupBox3, tr("黑名单"));
}

MyQQ::~MyQQ()
{

}

myqq


进度条

进度条用于告诉用户当前任务的进展情况,进度条对话框的使用有两种方式:模态方式和非模态方式。模态方式比较简单,使用QApplication::processEvents()使事件保持正常进行状态;非模态方式则需要通过QTime实现定时设置进度条的值。
Qt提供了两种进度条的显示方式:一种是QProgressBar提供了横向或纵向显示进度控件表示方式,用来描述任务的完成情况。另一种是QProgressDialog提供了一种慢速过程的进度对话框表示方式。标准进度条一般包括一个进度显示条,一个取消按钮以及一个标签。
实例使用一个对话框来完成两种进度条的显示方式:
Porgress.h:


#include <QDialog>
#include <QProgressBar>
#include <QProgressDialog>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit>
#include <QComboBox>
#include <QGridLayout>

class Progress : public QDialog
{
    Q_OBJECT

public:
    Progress(QWidget *parent = 0);
    ~Progress();

private:
    QLabel *fileNumLabel;
    QLineEdit *fileNumEdit;
    QLabel *typeLabel;
    QComboBox *typeComboBox;
    QProgressBar *progressBar;
    QPushButton *startButton;
    QGridLayout *mainLayout;

private slots:
    void startProgress();
};

progress.cpp:

#include "progress.h"

Progress::Progress(QWidget *parent)
    : QDialog(parent)
{
    // 构造函数完成界面各个控件的创建
    setWindowTitle(tr("ProgressBar"));
    // 设置字体
    QFont font("ZYSong18030", 12);
    setFont(font);

    fileNumLabel = new QLabel(tr("file's number :"));
    fileNumEdit = new QLineEdit;
    fileNumEdit->setText(tr("100000"));
    typeLabel = new QLabel(tr("select type :"));

    progressBar = new QProgressBar;

    // 选择类型下拉框
    typeComboBox = new QComboBox;
    typeComboBox->addItem(tr("ProgressBar"));
    typeComboBox->addItem(tr("ProgressDialog"));
    startButton = new QPushButton(tr("start"));

    mainLayout = new QGridLayout(this);
    mainLayout->addWidget(fileNumLabel, 0, 0);
    mainLayout->addWidget(fileNumEdit, 0, 1);
    mainLayout->addWidget(typeLabel, 1, 0);
    mainLayout->addWidget(typeComboBox, 1, 1);
    mainLayout->addWidget(progressBar, 2, 0, 1, 2);
    mainLayout->addWidget(startButton, 3, 1);

    mainLayout->setMargin(15);
    mainLayout->setSpacing(10);

    connect(startButton, &QPushButton::clicked, this, &Progress::startProgress);
}

Progress::~Progress()
{
}

void Progress::startProgress()
{
    bool ok;
    // 获取输入的file number
    int num = fileNumEdit->text().toInt(&ok);

    // 获取下拉框选择的项目
    if (typeComboBox->currentIndex() == 0)
    {
        // 设置进度条的步进范围是0到num
        progressBar->setRange(0, num);

        for (int i = 1; i < num + 1; ++i)
        {
            // 进度条向前递增
            progressBar->setValue(i);
        }
    }
    else if (typeComboBox->currentIndex() == 1)
    {
        // 创建一个进度条模态对话框
        QProgressDialog *progressDialog = new QProgressDialog(this);

        QFont font("ZYSong18030", 12);
        progressDialog->setFont(font);
        // 设置成模态对话框
        progressDialog->setWindowModality(Qt::WindowModal);
        // 设置对话框出现需等待的时间,默认为4
        progressDialog->setMinimumDuration(5);
        progressDialog->setWindowTitle(tr("please wait"));
        progressDialog->setLabelText(tr("copying......"));
        progressDialog->setCancelButtonText(tr("CANCEL"));
        progressDialog->setRange(0, num);

        for (int i = 1; i < num + 1; ++i)
        {
            progressDialog->setValue(i);

            // 点击取消按钮
            if (progressDialog->wasCanceled())
            {
                return;
            }
        }
    }
}

调色板QPalette类

Qt提供QPalette类专门用于管理对话框的外观显示。QPalette类相当于对话框活控件的调色板,控制着窗口与控件的所有颜色信息,所有窗体或控件都包含一个QPalette对象,在显示时按照它的QPalette对象中各部分状态下的颜色显示进行绘制。
QPalette有两个基本概念,一个是ColorGroup另一个是ColorRoleColorGroup有三种不同的状态:QPalette::Active获得焦点的状态;QPalette::Inactivate未获得焦点的状态;QPalette::Disable不可用的状态。ColorRole指的是颜色主题,即窗体中不同部位的颜色的分类。最常使用的函数是QPalette::setColor函数对颜色进行设置的同时,还区分状态。QPalette::setBrush通过画刷的设置对显示进行更改,即可以使用图片改变主题而非单一的颜色。
下面的代码使用QPalette类实现改变不同控件颜色的方法:
palette.h:


#include <QDialog>
#include <QLabel>
#include <QComboBox>
#include <QTextEdit>
#include <QLineEdit>
#include <QPalette>
#include <QGridLayout>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFrame>
#include <QStringList>
#include <QPushButton>

class Palette : public QDialog
{
    Q_OBJECT

public:
    Palette(QWidget *parent = 0);
    ~Palette();

    // 设置左侧控制面板
    void createCtrlFrame();
    // 设置右侧显示面板
    void createContnetFrame();
    // 完成颜色下拉框中插入颜色的工作
    void fillColorList(QComboBox *);
private slots:
    void showWindow();
    void showWindowText();
    void showButton();
    void showButtonText();
    void showBase();

private:

    // 左侧颜色选择面板
    QFrame *ctrlFrame;
    QLabel *windowLabel;
    QComboBox *windowComboBox;
    QLabel *windowTextLabel;
    QComboBox *windowTextComboBox;
    QLabel *buttonLabel;
    QComboBox *buttonComboBox;
    QLabel *buttonTextLabel;
    QComboBox *buttonTextComboBox;
    QLabel *baseLabel;
    QComboBox *baseComboBox;

    // 右侧具体显示面板
    QFrame *contentFrame;
    QLabel *label1;
    QComboBox *comboBox;
    QLabel *label2;
    QLineEdit *lineEdit;
    QTextEdit *textEdit;
    QPushButton *okBtn;
    QPushButton *cancelBtn;
};

palette.cpp:

#include "palette.h"

Palette::Palette(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle(tr("paltte"));

    // 在构造函数中对界面进行构建
    createCtrlFrame();
    createContnetFrame();
    QHBoxLayout *mainLayout = new QHBoxLayout(this);
    mainLayout->addWidget(ctrlFrame);
    mainLayout->addWidget(contentFrame);
}

Palette::~Palette()
{

}

void Palette::createCtrlFrame()
{
    // 控制面板的显示
    ctrlFrame = new QFrame;

    windowLabel = new QLabel(tr("QPaltte::Window :"));
    windowComboBox = new QComboBox;
    fillColorList(windowComboBox);
    connect(windowComboBox, SIGNAL(activated(int)), this, SLOT(showWindow()));

    windowTextLabel = new QLabel(tr("QPaltte::WindowText :"));
    windowTextComboBox = new QComboBox;
    fillColorList(windowTextComboBox);
    //connect(windowTextComboBox, &QComboBox::activated, this, &Palette::showWindowText);
    connect(windowTextComboBox, SIGNAL(activated(int)), this, SLOT(showWindowText()));

    buttonLabel = new QLabel(tr("QPaltte::Button :"));
    buttonComboBox = new QComboBox;
    fillColorList(buttonComboBox);
    //connect(buttonComboBox, &QComboBox::activated, this, &Palette::showButton);
    connect(buttonComboBox, SIGNAL(activated(int)), this, SLOT(showButton()));

    buttonTextLabel = new QLabel(tr("QPaltte::ButtonText :"));
    buttonTextComboBox = new QComboBox;
    fillColorList(buttonTextComboBox);
    //connect(buttonTextComboBox, &QComboBox::activated, this, &Palette::showButtonText);
    connect(buttonTextComboBox, SIGNAL(activated(int)), this, SLOT(showButtonText()));

    baseLabel = new QLabel(tr("QPaltte::Base :"));
    baseComboBox = new QComboBox;
    fillColorList(baseComboBox);
    //connect(baseComboBox, &QComboBox::activated, this, &Palette::showBase);
    connect(baseComboBox, SIGNAL(activated(int)), this, SLOT(showBase()));

    QGridLayout *mainLayout = new QGridLayout(ctrlFrame);
    mainLayout->setSpacing(15);
    mainLayout->addWidget(windowLabel, 0, 0);
    mainLayout->addWidget(windowComboBox, 0, 1);
    mainLayout->addWidget(windowTextLabel, 1, 0);
    mainLayout->addWidget(windowTextComboBox, 1, 1);
    mainLayout->addWidget(buttonLabel, 2, 0);
    mainLayout->addWidget(buttonComboBox, 2, 1);
    mainLayout->addWidget(buttonTextLabel, 3, 0);
    mainLayout->addWidget(buttonTextComboBox, 3, 1);
    mainLayout->addWidget(baseLabel, 4, 0);
    mainLayout->addWidget(baseComboBox, 4, 1);
}

void Palette::createContnetFrame()
{
    // 显示面板的显示
    contentFrame = new QFrame;

    label1 = new QLabel(tr("plz input a num"));
    comboBox = new QComboBox;

    label2 = new QLabel(tr("plz input the str"));
    lineEdit = new QLineEdit;

    textEdit = new QTextEdit;

    QGridLayout *TopLayout = new QGridLayout;
    TopLayout->addWidget(label1, 0, 0);
    TopLayout->addWidget(comboBox, 0, 1);
    TopLayout->addWidget(label2, 1, 0);
    TopLayout->addWidget(lineEdit, 1, 1);
    TopLayout->addWidget(textEdit, 2, 0, 1, 2);

    okBtn = new QPushButton(tr("OK"));
    cancelBtn = new QPushButton(tr("CANCEL"));

    QHBoxLayout *bottomLayout = new QHBoxLayout;
    bottomLayout->addStretch(1);
    bottomLayout->addWidget(okBtn);
    bottomLayout->addWidget(cancelBtn);

    QVBoxLayout *mainLayout = new QVBoxLayout(contentFrame);
    mainLayout->addLayout(TopLayout);
    mainLayout->addLayout(bottomLayout);
}

void Palette::fillColorList(QComboBox *c)
{
    // 获得Qt所有知道名称的颜色列表
    QStringList colorList = QColor::colorNames();
    // 为循环遍历做准备
    QString color;

    // 对颜色名列表进行遍历
    foreach (color, colorList)
    {
        // 新建一个QPixmap对象作为显示颜色的图标
        QPixmap pix(QSize(70, 20));
        // 填充颜色
        pix.fill(QColor(color));
        // 在下拉框中插入颜色图标
        c->addItem(QIcon(pix), NULL);
        c->setIconSize(QSize(70, 20));
        // 设置下拉框尺寸
        c->setSizeAdjustPolicy(QComboBox::AdjustToContents);
    }
}

// 用于响应背景颜色的选择
void Palette::showWindow()
{
    // 获取下拉框中选择的颜色
    QStringList colorList = QColor::colorNames();
    QColor color = QColor(colorList[windowComboBox->currentIndex()]);

    // 获取背景的QPalette对象
    QPalette p = contentFrame->palette();
    // 设置颜色为选中的颜色
    p.setColor(QPalette::Window, color);

    // 把修改后的调色板信息更新到背景板上
    contentFrame->setPalette(p);
    contentFrame->update();
}

// 用于响应文字的颜色,就是对前景色设置
void Palette::showWindowText()
{
    // 获取下拉框中选择的颜色
    QStringList colorList = QColor::colorNames();
    QColor color = QColor(colorList[windowComboBox->currentIndex()]);

    // 获取文字的QPalette对象
    QPalette p = contentFrame->palette();
    // 设置颜色为选中的颜色
    p.setColor(QPalette::WindowText, color);

    // 把修改后的调色板信息更新到背景板上
    contentFrame->setPalette(p);
}

// 对按钮背景色的选择
void Palette::showButton()
{
    // 获取下拉框中选择的颜色
    QStringList colorList = QColor::colorNames();
    QColor color = QColor(colorList[windowComboBox->currentIndex()]);

    // 获取按钮的QPalette对象
    QPalette p = contentFrame->palette();
    // 设置颜色为选中的颜色
    p.setColor(QPalette::Button, color);

    // 把修改后的调色板信息更新到背景板上
    contentFrame->setPalette(p);
    contentFrame->update();
}

// 对按钮上文字的选择
void Palette::showButtonText()
{
    // 获取下拉框中选择的颜色
    QStringList colorList = QColor::colorNames();
    QColor color = QColor(colorList[windowComboBox->currentIndex()]);

    // 获取按钮上文字的QPalette对象
    QPalette p = contentFrame->palette();
    // 设置颜色为选中的颜色
    p.setColor(QPalette::ButtonText, color);

    // 把修改后的调色板信息更新到背景板上
    contentFrame->setPalette(p);
}

// 文本框背景色的选择
void Palette::showBase()
{
    // 获取下拉框中选择的颜色
    QStringList colorList = QColor::colorNames();
    QColor color = QColor(colorList[windowComboBox->currentIndex()]);

    // 获取按钮上文字的QPalette对象
    QPalette p = contentFrame->palette();
    // 设置颜色为选中的颜色
    p.setColor(QPalette::Base, color);

    // 把修改后的调色板信息更新到背景板上
    contentFrame->setPalette(p);
}

这里写图片描述


QTime类

QTimecurrentTime()函数用于获取当前的系统时间,QTimetoString()函数用于将获取到的时间转换为字符串类型。为了便于显示,toString()函数的参数需要指定转换后时间的显示格式,也可以直接利用Qt::DataFormat作为参数指定显示的时间格式,如Qt::TextDate,Qt::ISODate,Qt::LocalDate
QLCDNumber类重定义了鼠标按下事件和鼠标移动事件。
实例实现一个在桌面上显示的可以拖拽的电子时钟。
Clock.h:基类选择QDIalog,在头文件中将继承关系改为QLCDNumber

#include <QDialog>
#include <QLCDNumber>
#include <QPalette>
#include <QTimer>
#include <QTime>
#include <QMouseEvent>

class Clock : public QLCDNumber
{
    Q_OBJECT

public:
    Clock(QWidget *parent = 0);
    ~Clock();

    void mouseMoveEvent(QMouseEvent *);
    void mousePressEvent(QMouseEvent *);

private slots:
    // 显示时间槽函数
    void showTime();

private:
    // 用于实现时钟里“:”的闪烁
    bool showColon;

    // 记录鼠标移动的位置
    QPoint dragPosition;
};

Clock.cpp:

#include "clock.h"

Clock::Clock(QWidget *parent)
    : QLCDNumber(parent)
{
    // 构造函数完成时钟的显示,并连接槽
    this->resize(150, 60);
    // 给时钟设置背景色
    QPalette p = palette();
    p.setColor(QPalette::Window, Qt::blue);
    setPalette(p);

    // 设置窗体为无边框窗体
    setWindowFlags(Qt::FramelessWindowHint);

    // 设置窗体的透明度
    setWindowOpacity(0.5);

    // 新建一个定时器对象
    QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, &Clock::showTime);

    // 以1000毫秒为周期启动定时器
    timer->start(1000);
    showTime();
    showColon = true; // 初始化
}

Clock::~Clock()
{

}

void Clock::mouseMoveEvent(QMouseEvent *event)
{
    // buttons() 返回鼠标的状态
    if (event->buttons() & Qt::LeftButton)
    {
        move(event->globalPos() - dragPosition);
        event->accept();
    }

}

void Clock::mousePressEvent(QMouseEvent *event)
{
    // 如果鼠标点下的是左键
    if (event->button() == Qt::LeftButton)
    {
        // 记录位置为鼠标相对于窗体左上角的相对位置
        dragPosition = event->globalPos() - frameGeometry().topLeft();
        event->accept();
    }
    else if (event->button() == Qt::RightButton)
    {
        close();
    }

}

void Clock::showTime()
{
    QTime time = QTime::currentTime();
    QString text = time.toString("hh:mm");

    if (showColon)
    {
        text[2] = ':';
        // 交替显示‘:’
        showColon = false;
    }
    else
    {
        text[2] = ' ';
        showColon = true;
    }
    // 将时间更新到窗体中
    display(text);
}

这里写图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值