亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于實現(xiàn)Qt秒表設(shè)計

 更新時間:2022年08月04日 11:35:46   作者:獨影闌珊°  
這篇文章主要為大家詳細介紹了基于實現(xiàn)Qt秒表設(shè)計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

基于Qt秒表設(shè)計

這個只是虛擬機下的Dialog中設(shè)計的秒表,大家感興趣的可以根據(jù)自己手機的秒表界面來設(shè)計,亦或是有別的想法也可以在ui中添加函數(shù),或者是在ui界面自己添加調(diào)整。本篇將給除了給出Qt秒表設(shè)計例子之外還會為大家提供一些常用函數(shù)。

一、Qt繪圖系統(tǒng)簡介

Qt的繪圖系統(tǒng)允許使用相同的API在屏幕和其它打印設(shè)備上進行繪制。整個繪圖系統(tǒng)基于 QPainter,QPainterDevice和QPaintEngine三個類。

QPainter用來執(zhí)行繪制的操作;

QPaintDevice則允許QPainter在其上面進行繪制,也就是QPainter工作的空間;

QPaintEngine提供了畫筆(QPainter)在不同的設(shè)備上進行繪制的統(tǒng)一的接口。

Qt 的繪圖系統(tǒng)實際上是,使用 QPainter在QPainterDevice上進行繪制,它們之間使用QPaintEngine進行通訊(也就是翻譯QPainter 的指令)。

二、QPainter類的繪圖函數(shù)

drawPoint 點drawLine 線
drawRect 矩形drawPath 路徑
drawArc 圓弧drawChord 弦
drawPie 扇形drawEllipse 橢圓
drawText 文字
drawRoundRect 圓角矩形
drawImage drawPixmap drawPicture 顯示圖像
drawPoints,drawLines,drawRects 多個點、多條線、多個矩形

三、幾種常用函數(shù)效果圖:

四、畫刷和畫筆

QBrush定義了QPainter的填充模式,具有樣式、顏色、漸變以及紋理等屬性。畫刷的style()定義了填充的樣式,使用Qt::BrushStyle枚舉,默認值是Qt::NoBrush,也就是不進行任何填充。
QPen定義了用于QPainter應(yīng)該怎樣畫線或者輪廓線。畫筆具有樣式、寬度、畫刷、筆帽樣式和連接樣式等屬性。畫筆的樣式style()定義了線的樣式。畫筆寬度width()或widthF()定義了畫筆的寬。注意,不存在寬度為 0 的線,畫筆寬度通常至少是 1 像素。
聲明畫刷或畫筆對象的時候,通??梢韵戎付伾?,然后再通過類中的setStyle、setWidth等成員函數(shù)設(shè)置畫刷或畫筆屬性。
QPainter對象要使用畫刷或畫筆,通常是調(diào)用setBrush和setPen成員函數(shù),設(shè)置過畫刷和畫筆的狀態(tài)將會一直保持。

五、圖像處理

Qt提供了4個處理圖像的類:QImage、QPixmap、QBitmap,QPicture,它們有著各自的特點。
QImage優(yōu)化了I/O操作,可以直接存取操作像素數(shù)據(jù)。
QPixmap優(yōu)化了再屏幕上顯示圖像的性能。
QBitmap從QPixmap繼承,只能表示黑白兩種顏色。
QPicture是可以記錄和重啟QPrinter命令的類。
對最簡單的圖片顯示而言,用QImage或QPixmap類比較常見。顯示一副圖像,可以在paintEvent函數(shù)中如下操作:

QPainter painter(this); // 聲明QPainter對象
… // 其他繪圖操作
// 聲明一個QPixmap對象并初始裝載圖像文件
QPixmap pm("/home/fish/HDU.png");
painter.drawPixmap((rect().width() - pm.width()) / 2,
(rect().height() - pm.height()) / 2, pm); // 居中顯示圖像

六、秒表設(shè)計例子

1、.pro文件

#-------------------------------------------------
#
# Project created by QtCreator 2019-12-04T16:50:48
#
#-------------------------------------------------

QT ? ? ? += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = qt_clock
TEMPLATE = app


SOURCES += main.cpp\
? ? ? ? dialog.cpp

HEADERS ?+= dialog.h

FORMS ? ?+= dialog.ui

2、頭文件:

dialog.h代碼;

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QTime>
#include <QMouseEvent>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
? ? Q_OBJECT

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

private:
? ? Ui::Dialog *ui;
? ? int state;
? ? int nMSCnt;
? ? QTime ? sTime;
? ? QList<int> lstCnt;
? ? int idx;

? ? QRect ? rcBottom;
? ? QRect ? rcLeft;
? ? QRect ? rcRight;
private ? slots:
? ? ? ? void ? ?mytimer ( );

? ? // QWidget interface
protected:
? ? void paintEvent(QPaintEvent *);

? ? // QWidget interface
protected:
? ? void mousePressEvent(QMouseEvent *);

? ? // QWidget interface
protected:
? ? void wheelEvent(QWheelEvent *);
};

#endif // DIALOG_H

3、源文件

(1)dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include <QPainter>
#include <QTimer>

Dialog::Dialog(QWidget *parent) :
? ? QDialog(parent),
? ? ui(new Ui::Dialog)
{
? ? ui->setupUi(this);
? ? state = 0;
? ? nMSCnt = 0;
? ? idx =0;
? ? sTime =QTime::currentTime();
? ? QTimer*timer =new QTimer(this);
? ? connect(timer,SIGNAL(timeout()),this,SLOT(mytimer()));
? ? timer->start(10);
}

Dialog::~Dialog()
{
? ? delete ui;
}

void Dialog::mytimer()
{
? ? ?if(1==state){
? ? ? ? ?update();
? ? ?}
}


void Dialog::paintEvent(QPaintEvent *)
{
? ? ? QRect ?rc = rect();
? ? ? int size = rc.width() > rc.height() ? ?rc.height() : rc.width();

? ? ? QPainter qp(this);
? ? ? qp.setFont(QFont("Arial",size/6));
? ? ? qp.setPen(Qt::black);

? ? ? QString str;
? ? ? int nms;
? ? ? if(state>0){
? ? ? ? ? if(1==state)
? ? ? ? ? ? ? nms = (sTime.msecsTo(QTime::currentTime()) + nMSCnt) / 10;
? ? ? ? ? else
? ? ? ? ? ? ? nms = nMSCnt / 10;
? ? ? ? ? str.sprintf("%02d:%02d.%02d",nms / 6000 , (nms / 100) % 60 , nms % 100);
? ? ? }
? ? ? else {
? ? ? ? ? ?str="00:00.00";
? ? ? }

? ? ? if (lstCnt.empty())
? ? ? ? ? qp.drawText(rect(),Qt::AlignCenter,str);
? ? ? else{
? ? ? ? ? qp.drawText(rect(),Qt::AlignTop | Qt::AlignHCenter,str);
? ? ? ? ? qp.setPen(Qt::gray);
? ? ? ? ? qp.setFont(QFont("Arial",size / 10));
? ? ? ? ? QRect t = rect();
? ? ? ? ? t.translate(0, size / 6 + size / 20);
? ? ? ? ? nms -= lstCnt.last() / 10;
? ? ? ? ? str.sprintf("%02d:%02d.%02d",nms/6000 , (nms/100)%60 , nms%100);
? ? ? ? ?qp.drawText(t,Qt::AlignTop | Qt::AlignHCenter,str);

? ? ? ? ?qp.setFont(QFont("Arial",size / 15));
? ? ? ? ?qp.setPen(Qt::darkBlue);
? ? ? ? ?t.translate(0, size / 6);
? ? ? ? ?int i =idx,j;
? ? ? ? ?if(i>= lstCnt.size())
? ? ? ? ? ? ?i = lstCnt.size() - 1;
? ? ? ? ?j =i - 4;

? ? ? ? ?for(;i>=0 &&i>j;--i){
? ? ? ? ? ? ?nms = lstCnt[i] / 10;
? ? ? ? ? ? ?int nnms;
? ? ? ? ? ? ?if(i>0)
? ? ? ? ? ? ? ? ?nnms = (lstCnt[i] - lstCnt[i-1]) / 10;
? ? ? ? ? ? ?str.sprintf("%02d ? ? ?%02d:%02d.%02d ? ? ?%02d:%02d.%02d",
? ? ? ? ? ? ? ? ? ? ? ? ?i + 1, nms / 6000,(nms /100) % 60,nms % 100, nnms /6000 ,(nnms /100)%60,nnms % 100);
? ? ? ? ? ? ?qp.drawText(t,Qt::AlignTop | Qt::AlignHCenter,str);
? ? ? ? ? ? ?t.translate(0, size /10);
? ? ? ? ?}
? ? ? }

? ? ? qp.setFont(QFont("Arial",size/15));
? ? ? qp.setPen(Qt::red);
? ? ? int hh = size / 10;
? ? ? rcLeft ?= QRect(rc.left(), rc.bottom()-hh*2, rc.width()/2, hh);
? ? ? rcRight = QRect(rc.width()/2, rc.bottom()-hh*2,rc.width()/2,hh);
? ? ? rcBottom = QRect(rc.left(),rc.bottom()-hh*2,rc.width(),hh);

? ? ? switch(state){
? ? ? default:
? ? ? ? ? qp.drawText(rcBottom,Qt::AlignCenter,"開始");
? ? ? ? ? break;
? ? ? case 1:
? ? ? ? ? qp.drawText(rcLeft,Qt::AlignCenter,"暫停");
? ? ? ? ? qp.setPen(Qt::blue);
? ? ? ? ? qp.drawText(rcRight, Qt::AlignCenter,"計次");
? ? ? ? ? break;
? ? ? case 2:
? ? ? ? ? qp.drawText(rcLeft,Qt::AlignCenter,"繼續(xù)");
? ? ? ? ? qp.setPen(Qt::blue);
? ? ? ? ? qp.drawText(rcRight,Qt::AlignCenter,"重置");
? ? ? ? ? break;
? ? ? }
}

void Dialog::mousePressEvent(QMouseEvent *e)
{
? ? if(Qt::LeftButton == e->button()){
? ? ? ? switch(state){
? ? ? ? default:
? ? ? ? ? ? if(rcBottom.contains(e->pos())){
? ? ? ? ? ? ? ? nMSCnt = 0;
? ? ? ? ? ? ? ? sTime = QTime::currentTime();
? ? ? ? ? ? ? ? state = 1;
? ? ? ? ? ? }
? ? ? ? break;
? ? ? ? case 1:
? ? ? ? ? ? if(rcLeft.contains(e->pos())){
? ? ? ? ? ? ? ? state = 2;
? ? ? ? ? ? ? ? nMSCnt +=sTime.msecsTo(QTime::currentTime());
? ? ? ? ? ? ? ? update();
? ? ? ? ? ? }
? ? ? ? ? ? else if(rcRight.contains(e->pos())){
? ? ? ? ? ? ? ? ? lstCnt.append(nMSCnt + sTime.msecsTo(QTime::currentTime()));
? ? ? ? ? ? ? ? ? idx = lstCnt.size() - 1;
? ? ? ? ? ? ? ? ? update();
? ? ? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? case 2:
? ? ? ? ? ? if(rcLeft.contains(e->pos())){
? ? ? ? ? ? ? ? state = 1;
? ? ? ? ? ? ? ? sTime = QTime::currentTime();
? ? ? ? ? ? }
? ? ? ? ? ? else if(rcRight.contains(e->pos())){
? ? ? ? ? ? ? ? state = 0;
? ? ? ? ? ? ? ? nMSCnt = 0;
? ? ? ? ? ? ? ? lstCnt.clear();
? ? ? ? ? ? ? ? update();
? ? ? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? }
? ? }
}


void Dialog::wheelEvent(QWheelEvent *e)
{
? ? ?if(e->delta() >0){
? ? ? ? ?if(idx < lstCnt.size() -1){
? ? ? ? ? ? ?++idx;
? ? ? ? ? ? ?update();
? ? ? ? ?}
? ? ?}
? ? ? else {
? ? ? ? ?if(idx>0){
? ? ? ? ? ? ?--idx;
? ? ? ? ? ? ?update();
? ? ? ? ?}
? ? }
}

(2)main.cpp

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

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

? ? return a.exec();
}

(3)規(guī)定界面,在ui界面設(shè)置里面(這里我只是簡單的設(shè)計成正方形,節(jié)省時間,需要別的設(shè)計,或者探討,可以加我QQ或者vx)

七、編譯演示。

(1)如果你工程很多,需要將你要演示的調(diào)制成活動項目,如下圖所示;

(2)編譯 -> 運行 -> 結(jié)果顯示

剛才就說過了,界面設(shè)置你除了手動畫,還可以在這個函數(shù)里面進行添加,如下圖所示;

廢話不多說,看演示結(jié)果;

點擊開始,開始計數(shù);

點擊計次,開始加次數(shù);

暫停 -> 重置 重置之后回到清零狀態(tài);

另:看完了這個大家也可以試著設(shè)計自己手機中秒表的界面,亦或是下圖的計時器,原理異曲同工,大家可以試著調(diào)用video相關(guān)函數(shù),通過鼠標(biāo)點擊函數(shù)去實現(xiàn)聲音大小的控制。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java C++ 算法題解leetcode1608特殊數(shù)組特征值

    Java C++ 算法題解leetcode1608特殊數(shù)組特征值

    這篇文章主要為大家介紹了Java C++ 算法題解拓展leetcode1608特殊數(shù)組特征值實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 怎么實現(xiàn)類的成員函數(shù)作為回調(diào)函數(shù)

    怎么實現(xiàn)類的成員函數(shù)作為回調(diào)函數(shù)

    不使用成員函數(shù),為了訪問類的成員變量,可以使用友元操作符(friend),在C++中將該函數(shù)說明為類的友元即可
    2013-10-10
  • Qt 實現(xiàn)畫線筆鋒效果詳細原理及示例代碼

    Qt 實現(xiàn)畫線筆鋒效果詳細原理及示例代碼

    這篇文章主要介紹了Qt 實現(xiàn)畫線筆鋒效果詳細原理及示例代碼。文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 遞歸形式與非遞歸形式的斐波那契數(shù)列的用法分析

    遞歸形式與非遞歸形式的斐波那契數(shù)列的用法分析

    本篇文章是對遞歸形式與非遞歸形式的斐波那契數(shù)列的用法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 深入探究C語言中的二叉樹

    深入探究C語言中的二叉樹

    樹是一種非線性的數(shù)據(jù)結(jié)構(gòu),它是由n(n>=0)個有限結(jié)點組成一個具有層次關(guān)系的集合。把它叫做樹是因 為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。本文將帶你深入探究C語言中的二叉樹,感興趣的同學(xué)跟著小編一起學(xué)習(xí)吧
    2023-05-05
  • C++初始化函數(shù)列表詳細解析

    C++初始化函數(shù)列表詳細解析

    C++可以定義引用類型的成員變量,引用類型的成員變量必須在構(gòu)造函數(shù)的初始化列表中進行初始化
    2013-09-09
  • C語言的三種條件判斷語句你都了解嗎

    C語言的三種條件判斷語句你都了解嗎

    這篇文章主要為大家詳細介紹了C語言的三種條件判斷語句,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 深入sizeof的使用詳解

    深入sizeof的使用詳解

    本篇文章是對sizeof的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • VC WinExec打開指定程序或者文件的方法

    VC WinExec打開指定程序或者文件的方法

    使用WinExec命令打開指定程序或者文件的參數(shù)說明
    2008-11-11
  • C++中extern

    C++中extern "C"的用法

    這篇文章主要介紹了C++中extern "C"的用法,是深入理解C++所應(yīng)該掌握的概念,需要的朋友可以參考下
    2014-08-08

最新評論