一、HTML
<div class="layui-input-inline" style="width: 200px;">
<input type="text" name="startDate" id="startDate" placeholder="起始日期" autocomplete="off" class="layui-input date">
</div>
<div class="layui-form-mid">-</div>
<div class="layui-input-inline" style="width: 200px;">
<input type="text" name="endDate" id="endDate" placeholder="終止日期" autocomplete="off" class="layui-input date">
</div>
二、JS
垂直時間軸控件,主要用來描述企業(yè)發(fā)展歷程大事件,或者軟件版本迭代歷史等,通過時間節(jié)點和事件描述來直觀的展示發(fā)展的過程,一般在web網(wǎng)頁或者app中經(jīng)常看到此類控件,尤其是公司的官網(wǎng)關(guān)于公司部分,著重在一些獨角獸公司或者正處于蓬勃發(fā)展的公司,用來展示自己多牛逼,發(fā)展多么迅猛等。
垂直時間軸控件主要存儲的數(shù)據(jù)包含兩個,一個是時間節(jié)點,一個是事件描述,為了后期的拓展性,采用結(jié)構(gòu)體來存放這個數(shù)據(jù),比如后期還可能增加該事件是否屬于重大事件標(biāo)記,是的話則繪制的時候突出顯示比如加大字號加粗,本控件的主要難點在于自動計算和排列來繪制時間和事件描述,默認(rèn)采用對等分的機制來處理繪制,還有部分時間軸控件是左側(cè)時間右側(cè)事件描述,這個可以在源碼基礎(chǔ)上自行更改或者增加樣式,為了能夠展示所有的事件,本控件主體是繼承自滾動條區(qū)域控件,超過高度自動產(chǎn)生滾動條。
#ifndef TIMEAXIS_H
#define TIMEAXIS_H
/**
* 垂直時間軸控件 作者:雨田哥(QQ:3246214072) 整理:feiyangqingyun(QQ:517216493) 2019-10-07
* 1:可設(shè)置節(jié)點邊距
* 2:可設(shè)置節(jié)點高度
* 3:可設(shè)置信息邊框邊距
* 4:可設(shè)置信息所占高度
* 5:可設(shè)置基準(zhǔn)顏色/線條顏色
* 6:可設(shè)置標(biāo)題/信息集合
* 7:自動產(chǎn)生滾動條
* 8:支持字符串形式設(shè)置數(shù)據(jù)
*/
#include <QScrollArea>
class TimeAxisWidget;
#ifdef quc
#if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
#include <QtDesigner/QDesignerExportWidget>
#else
#include <QtUiPlugin/QDesignerExportWidget>
#endif
class QDESIGNER_WIDGET_EXPORT TimeAxis : public QScrollArea
#else
class TimeAxis : public QScrollArea
#endif
{
Q_OBJECT
Q_PROPERTY(int itemMargin READ getItemMargin WRITE setItemMargin)
Q_PROPERTY(int itemHeight READ getItemHeight WRITE setItemHeight)
Q_PROPERTY(int infoPadding READ getInfoPadding WRITE setInfoPadding)
Q_PROPERTY(int infoHeight READ getInfoHeight WRITE setInfoHeight)
Q_PROPERTY(QColor baseColor READ getBaseColor WRITE setBaseColor)
Q_PROPERTY(QColor lineColor READ getLineColor WRITE setLineColor)
Q_PROPERTY(QString title READ getTitle WRITE setTitle)
Q_PROPERTY(QString infos READ getInfos WRITE setInfos)
public:
explicit TimeAxis(QWidget *parent = 0);
private:
int itemMargin; //節(jié)點邊距
int itemHeight; //節(jié)點高度
int infoPadding; //信息邊距
int infoHeight; //信息高度
QColor baseColor; //基準(zhǔn)顏色
QColor lineColor; //線條顏色
QString title; //標(biāo)題
QString infos; //信息集合
//時間軸主控件
TimeAxisWidget *timeAxisWidget;
public:
int getItemMargin() const;
int getItemHeight() const;
int getInfoPadding() const;
int getInfoHeight() const;
QColor getBaseColor() const;
QColor getLineColor() const;
QString getTitle() const;
QString getInfos() const;
QSize sizeHint() const;
QSize minimumSizeHint() const;
TimeAxisWidget *getWidget();
public Q_SLOTS:
//設(shè)置節(jié)點邊距+節(jié)點高度
void setItemMargin(int itemMargin);
void setItemHeight(int itemHeight);
//設(shè)置信息邊距+信息高度
void setInfoPadding(int infoPadding);
void setInfoHeight(int infoHeight);
//設(shè)置基準(zhǔn)顏色+線條顏色
void setBaseColor(const QColor &baseColor);
void setLineColor(const QColor &lineColor);
//設(shè)置標(biāo)題+信息集合
void setTitle(const QString &title);
void setInfos(const QString &infos);
};
class TimeAxisWidget : public QWidget
{
Q_OBJECT
public:
//可以自行拓展其他信息
struct TimeAxisInfo {
QString time; //時間
QString info; //信息
};
explicit TimeAxisWidget(QWidget *parent = 0);
protected:
void paintEvent(QPaintEvent *);
void drawTitle(QPainter *painter);
void drawLine(QPainter *painter);
void drawInfo(QPainter *painter);
void drawInfoRight(QPainter *painter, const QRectF &infoRect, int infoHeight);
void drawInfoLeft(QPainter *painter, const QRectF &infoRect, int infoHeight);
private:
int itemMargin; //節(jié)點邊距
int itemHeight; //節(jié)點高度
int infoPadding; //信息邊距
int infoHeight; //信息高度
QColor baseColor; //基準(zhǔn)顏色
QColor lineColor; //線條顏色
QString title; //標(biāo)題
QString infos; //信息集合
//信息集合結(jié)構(gòu)體
QList<TimeAxisInfo> itemInfos;
public:
int getItemMargin() const;
int getItemHeight() const;
int getInfoPadding() const;
int getInfoHeight() const;
QColor getBaseColor() const;
QColor getLineColor() const;
QString getTitle() const;
QString getInfos() const;
QSize sizeHint() const;
QSize minimumSizeHint() const;
public Q_SLOTS:
//設(shè)置節(jié)點邊距+節(jié)點高度
void setItemMargin(int itemMargin);
void setItemHeight(int itemHeight);
//設(shè)置信息邊距+信息高度
void setInfoPadding(int infoPadding);
void setInfoHeight(int infoHeight);
//設(shè)置基準(zhǔn)顏色+線條顏色
void setBaseColor(const QColor &baseColor);
void setLineColor(const QColor &lineColor);
//設(shè)置標(biāo)題+信息集合
void setTitle(const QString &title);
void setInfos(const QString &infos);
//設(shè)置信息集合,結(jié)構(gòu)體方式
void setItemInfos(const QList<TimeAxisInfo> &itemInfos);
};
#endif // TIMEAXIS_H
【領(lǐng)QT開發(fā)教程學(xué)習(xí)資料,點擊下方鏈接莬費領(lǐng)取↓↓,先碼住不迷路~】
點擊這里:Qt資料領(lǐng)取(視頻教程+文檔+代碼+項目實戰(zhàn))
void TimeAxisWidget::drawTitle(QPainter *painter)
{
painter->save();
QFont font;
font.setBold(true);
font.setPointSize(16);
painter->setFont(font);
painter->setPen(baseColor);
painter->drawText(itemMargin, itemMargin, width() - 2 * itemMargin, 40, Qt::AlignCenter, title);
painter->restore();
}
void TimeAxisWidget::drawLine(QPainter *painter)
{
painter->save();
painter->setPen(QPen(lineColor, 6));
int startY = itemMargin + 50;
int endY = startY + itemInfos.size() * itemHeight;
painter->drawLine(width() / 2.0, startY, width() / 2.0, endY);
painter->restore();
//設(shè)置下固定高度
this->setFixedHeight(endY + itemMargin);
}
void TimeAxisWidget::drawInfo(QPainter *painter)
{
painter->save();
painter->setPen(Qt::NoPen);
QFont font;
font.setPointSize(12);
painter->setFont(font);
int startY = itemMargin + 50;
int centerX = this->width() / 2.0;
int spacer = itemMargin + 10;
//追個繪制時間軸信息集合,偶數(shù)行左側(cè)繪制時間右側(cè)繪制信息
for (int i = 0; i < itemInfos.size(); i++) {
painter->setBrush(Qt::white);
painter->setPen(QPen(baseColor, 2));
if (i % 2 == 0) {
//繪制時間
QRectF textRect(0, startY, centerX - spacer, itemHeight);
painter->drawText(textRect, Qt::AlignRight | Qt::AlignVCenter, itemInfos.at(i).time);
//繪制信息邊框
QRectF infoRect(centerX + spacer, textRect.center().y() - infoHeight / 2.0, centerX - spacer - itemMargin - infoHeight / 2.0, infoHeight);
drawInfoRight(painter, infoRect, infoHeight);
//繪制信息背景
painter->setBrush(baseColor);
drawInfoRight(painter, infoRect.adjusted(infoPadding, infoPadding, 0, -infoPadding), infoHeight - infoPadding * 2);
//繪制信息文字
painter->setPen(Qt::white);
painter->drawText(infoRect.adjusted(infoPadding, infoPadding, 0, -infoPadding), Qt::AlignCenter, itemInfos.at(i).info);
} else {
//繪制時間
QRectF textRect(centerX + spacer, startY, centerX - spacer, itemHeight);
painter->drawText(centerX + spacer, startY, centerX - spacer, itemHeight, Qt::AlignLeft | Qt::AlignVCenter, itemInfos.at(i).time);
//繪制信息邊框
QRectF infoRect(itemMargin + infoHeight / 2.0, textRect.center().y() - infoHeight / 2.0, centerX - spacer - itemMargin - infoHeight / 2.0, infoHeight);
drawInfoLeft(painter, infoRect, infoHeight);
//繪制信息背景
painter->setBrush(baseColor);
drawInfoLeft(painter, infoRect.adjusted(0, infoPadding, -infoPadding, -infoPadding), infoHeight - infoPadding * 2);
//繪制信息文字
painter->setPen(Qt::white);
painter->drawText(infoRect.adjusted(0, infoPadding, -infoPadding, -infoPadding), Qt::AlignCenter, itemInfos.at(i).info);
}
//繪制垂直線對應(yīng)的圓
painter->setPen(Qt::NoPen);
painter->setBrush(baseColor);
painter->drawEllipse(centerX - 8, startY + itemHeight / 2.0 - 8, 16, 16);
painter->setBrush(Qt::white);
painter->drawEllipse(centerX - 4, startY + itemHeight / 2.0 - 4, 8, 8);
//Y軸往下移一個高度
startY += itemHeight;
}
painter->restore();
}
原文鏈接:https://www.cnblogs.com/feiyangqingyun/p/11639987.html
【領(lǐng)QT開發(fā)教程學(xué)習(xí)資料,點擊下方鏈接莬費領(lǐng)取↓↓,先碼住不迷路~】
點擊這里:「鏈接」
頁編程之?dāng)?shù)字選擇器。
同學(xué)們好!這里是免費少兒編程知識分享,每天一行代碼誰都能學(xué)會!今天分享的知識是數(shù)字選擇器,用到的是input標(biāo)簽,type屬性值為range。這個控件常被用來快速輸入不太精準(zhǔn)的數(shù)字,比如說調(diào)節(jié)明暗色值高寬等數(shù)據(jù),以一個可以拖動的滾動條形態(tài)出現(xiàn)。
先來看看今天實例的運行效果,網(wǎng)頁上為了方便展示,我仍將其分為了上下兩段,上面的是一個數(shù)學(xué)加法公式,默認(rèn)是0+0=0。
下面是兩個Range控件,中間一個加號,先拖動第一個range,發(fā)現(xiàn)加數(shù)值發(fā)生了變化,拖動第二個時被加數(shù)值發(fā)生了變化。而且不論是拖動哪一個range,控件最終都會自動得算出等式的值。這就是range控件的一個簡單使用場景,效果各位同學(xué)都已經(jīng)看到了。
《ipt t現(xiàn)在我們來看看實現(xiàn)的代碼吧。igut range控件仍然是由input,《ip標(biāo)簽的type屬性來編寫而成的。它常用的屬性有Max控件能接受的最大數(shù)值范圍。<ipt tnpe Min控件能接受的最小數(shù)值范圍。tep每次拖動時值自動增加或者減少多少。
《ipuvalue設(shè)置控件在頁面加載之初的默認(rèn)值。onMouserMove事件當(dāng)鼠標(biāo)在控件移動時觸發(fā)。《ip這些屬性其實早就已經(jīng)給你們講過了,相信各位同學(xué)自己也能看明白。aipt控件就講完了。
《p各位同學(xué)你們有沒有發(fā)現(xiàn)司與定出稱力be?ipt 當(dāng)基礎(chǔ)知識累積到一定程度的時候,《input p編程也就沒有那么難了。《iput 就算是陌生的東西只要出現(xiàn)過,《inut pa你猜也能猜個八九不離十。
《ipt 還有時間來講解一下示例里的JS吧。onMousemove事件加上了自定義函數(shù)CSUM。《iptp" 只要鼠標(biāo)在控件上移動,《ip就調(diào)用這個函數(shù)來完成計算等式的值。事件中的函數(shù)名和JS中的函數(shù)名必須完全一致。《ip在CSUM中我先定義了三個變量ABC,AB分別用來保存兩個 reng 的值。這里的A1、A2、A3就是上一章節(jié)才講過的label標(biāo)簽,也是使用id來引用的。將AB的值分別顯示在label中。
·這一句是計算a加b的值,《ipt tne在A3這個label中顯示出來,i這里還用到了JS的內(nèi)置函數(shù)syslnt,可以將字符串轉(zhuǎn)化為數(shù)字,涉及到變量類型就先不講了。
·總之最后的結(jié)果就是示例的樣子,《ipet t》在這里還有一段注釋代碼,以后學(xué)習(xí)了JS之后再回過頭來看就會非常有意思。ipt tpr'就會非常有意思,這個控件的寫法和使用都很簡單。
今天的分享就到這里,希望各位同學(xué)下去照著寫三遍,做到不看視頻也能夠?qū)懗鰜恚械陌咐跋嚓P(guān)文檔均可以向我獲取,下期見。網(wǎng)頁編程服務(wù)端編程數(shù)據(jù)庫算法,點贊關(guān)注。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。