簡介:
-
使用了繪圖事件、定時事件,有兩個窗口,一個窗口用於設置時間(主窗口),一個是時鍾窗口
1.主窗口
menu.h文件:
#ifndef MENU_H #define MENU_H #include <QWidget> #include <QPushButton> #include <QLineEdit> class menu : public QWidget { Q_OBJECT public: explicit menu(QWidget *parent = nullptr); public: QPushButton *bt1; //顯示時鍾 QPushButton *bt2; //設置時間 QLineEdit *ls; //輸入秒 QLineEdit *lm; //輸入分 QLineEdit *lh; //輸入時 signals: void display(); //顯示信號 void setTime(int h,int m,int s); //設置時間信號 public: void send_s(); void send_t(); public slots: }; #endif // MENU_H
#include "menu.h" #include <QHBoxLayout> #include <QVBoxLayout> #include <QLabel> menu::menu(QWidget *parent) : QWidget(parent) { resize(480,480); QHBoxLayout *hb = new QHBoxLayout(); QVBoxLayout *vb = new QVBoxLayout(); QLabel *l1 = new QLabel(":"); QLabel *l2 = new QLabel(":"); bt1 = new QPushButton("顯示時鍾"); bt2 = new QPushButton("設置時間"); ls = new QLineEdit("0"); lm = new QLineEdit("0"); lh = new QLineEdit("0"); hb->addWidget(lh); hb->addWidget(l1); hb->addWidget(lm); hb->addWidget(l2); hb->addWidget(ls); hb->addWidget(bt2); vb->addLayout(hb); vb->addWidget(bt1); this->setLayout(vb); connect(bt1,&QPushButton::released,this,&menu::send_s); //顯示時鍾 connect(bt2,&QPushButton::released,this,&menu::send_t); //設置時間 } void menu::send_t() //設置 { int s = ls->text().toInt(); int m = lm->text().toInt(); int h = 5 * lh->text().toInt(); emit setTime(h,m,s); } void menu::send_s() //顯示 { emit display(); }
2.時鍾窗口
widget.h文件:
#ifndef WIDGET_H #define WIDGET_H #include "menu.h" #include <QWidget> #include <QPaintEvent> //繪圖事件 #include <QTimerEvent> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: int s = 0; //秒 int m = 0; //分 int h = 0; //時 QString T; //總時間 QPainter *painter; menu w1; public: void send_s(); //顯示鍾表 void get_t(int h1,int m1,int s1); //設置時間 void timerEvent(QTimerEvent *adf); //定時 void paintEvent(QPaintEvent *event); //繪圖 public: explicit Widget(QWidget *parent = nullptr); ~Widget(); private: Ui::Widget *ui; }; #endif // WIDGET_H
#include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QPainter> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); w1.show(); startTimer(100); //定時1秒 resize(470,470); this->setMaximumSize(470,470); //設置窗口大小 connect(&w1,&menu::display,this,&Widget::send_s); //顯示鍾表 connect(&w1,&menu::setTime,this,&Widget::get_t); } void Widget::send_s() //顯示鍾表 { this->show(); } void Widget::get_t(int h1,int m1,int s1) { s = s1; m = m1; h = h1; } void Widget::timerEvent(QTimerEvent *event) { qDebug() <<"定時" ; s ++; if(s == 60) //180+360=540 { m++; s = 0; } if(m == 5) { h ++; } if(m == 60) { m = 0; } if(h == 12) { h = 0; } QString Ss = QString::number(s); QString Sm = QString::number(m); int H = h / 5; QString Sh = QString::number(H); T = Sh + ":" + Sm + ":" +Ss; qDebug() <<T; } void Widget::paintEvent(QPaintEvent *event) { painter = new QPainter(this); //畫家 /* 畫筆 */ QPen pen(Qt::red,0); painter->setPen(pen); /* 移動畫家 */ painter->translate(this->width()/2,this->height()/2); /* 畫鍾 */ QRectF target(-(this->width()/2),-(this->height()/2), this->width(), this->width()); QRectF source(0,0, this->width(), this->height()); QPixmap pixmap(":/new/prefix1/time1.png"); painter->drawPixmap(target, pixmap, source); /* 畫秒針 */ QRectF target_s(0,5,200, 220); QRectF source_s(0,0, this->width(),this->height()); QPixmap pixmap_s(":/new/prefix1/time_s.png"); painter->rotate(s*6+180); //定時旋轉秒針 painter->drawPixmap(target_s, pixmap_s, source_s); /* 畫分針 */ QRectF target_m(-5,-5,200, 220); QRectF source_m(0,0, this->width(), this->height()); QPixmap pixmap_m(":/new/prefix1/time_m.png"); painter->rotate(-(s*6+180)); //移動回原位 painter->rotate(m*6+180); //旋轉分針 painter->drawPixmap(target_m, pixmap_m, source_m); /* 畫時針 */ QRectF target_h(-7,-7,200, 220); QRectF source_h(0,0, this->width(), this->width()); QPixmap pixmap_h(":/new/prefix1/time_h.png"); painter->rotate(-(m*6+180)); //移動回原位 painter->rotate((h*6)+180); //旋轉分針 painter->drawPixmap(target_h, pixmap_h, source_h); painter->rotate(-(h*6+180)); painter->drawText(-50,0,100,50,Qt::AlignCenter, T); //數字時鍾 painter->rotate(h*6+180); update(); } Widget::~Widget() { delete ui; }