QT编写动态曲线.docx
- 文档编号:10691649
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:16
- 大小:18.57KB
QT编写动态曲线.docx
《QT编写动态曲线.docx》由会员分享,可在线阅读,更多相关《QT编写动态曲线.docx(16页珍藏版)》请在冰豆网上搜索。
QT编写动态曲线
喜马拉雅--巅峰之作
主页博客相册|个人档案|好友|i贴吧
查看文章
【转】qt实现实时动态曲线
(一)
2011年04月19日星期二下午12:
39
转载自Linuxzrq
最终编辑Linuxzrq
display.h:
#ifndefDISPLAY_H
#defineDISPLAY_H
#ifndefQT_H
#include
#endif//QT_H
classQTimer;
classScreen;
classQStringList;
classQString;
classQLineEdit;
classQPushButton;
classDisplayWidget:
publicQWidget{
Q_OBJECT
public:
DisplayWidget(QWidget*parent=0,constchar*name=0);
QSizesizeHint()const;
doublereadCurveDate();
voidreadFile();
voidrun();
privateslots:
voidtick();
voidstart();//startbutton
voidstop();//stopbutton
private:
Screen*screen1;
QLineEdit*lineEdit;//displaycurvedata
QPushButton*startButton,*stopButton;
QTimer*timer;
enum{Margin=40};
QStringstr;
QStringListstrlist;
QStringList:
:
Iteratorit;
inttime;
doubleyval;
};
#endif//PLOT_H
display.cpp:
#include"display.h"
#include"screen.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;
DisplayWidget:
:
DisplayWidget(QWidget*parent,constchar*name)
:
QWidget(parent,name)
{
timer=0;
QVBoxLayout*vbox=newQVBoxLayout(this,10);
QHBoxLayout*hbox=newQHBoxLayout(vbox);
screen1=newScreen(this);
screen1->setYTitle(QObject:
:
tr("dynamiccurve"));
vbox->addWidget(screen1);
lineEdit=newQLineEdit(this);
lineEdit->setReadOnly(TRUE);
hbox->addWidget(lineEdit);
startButton=newQPushButton(this);
startButton->setText(tr("&Start"));
startButton->setAccel(QKeySequence(tr("Alt+S")));
stopButton=newQPushButton(this);
stopButton->setText(tr("Sto&p"));
stopButton->setAccel(QKeySequence(tr("Alt+P")));
hbox->addWidget(startButton);
hbox->addWidget(stopButton);
connect(startButton,SIGNAL(clicked()),SLOT(start()));
connect(stopButton,SIGNAL(clicked()),SLOT(stop()));
time=0;
yval=0.0;
readFile();
}
voidDisplayWidget:
:
run()
{
if(!
timer)
{
timer=newQTimer(this);
connect(timer,SIGNAL(timeout()),SLOT(tick()));
}
timer->start(1000);//delay1s
}
voidDisplayWidget:
:
tick()
{
yval=readCurveDate();
screen1->animate(yval);
lineEdit->setText(QString:
:
number(yval));//displaycurvedata
}
voidDisplayWidget:
:
start()
{
run();
}
voidDisplayWidget:
:
stop()
{
timer->stop();
}
QSizeDisplayWidget:
:
sizeHint()const
{
returnQSize(32*Margin,24*Margin);
}
//readdatafromfile
voidDisplayWidget:
:
readFile()
{
QFilefile("in.txt");
file.open(QIODevice:
:
ReadOnly);
QTextStreamin(&file);
str=in.read();
strlist=QStringList:
:
split("",str);
it=strlist.begin();
}
doubleDisplayWidget:
:
readCurveDate()
{
QStringtempStr;
doubletempDate;
tempStr=(QString)*it;
tempDate=tempStr.toDouble();
if(it!
=strlist.end())
{
++it;
}
else
{
it=strlist.begin();
}
returntempDate;
screen.h:
#ifndefSCREEN_H
#defineSCREEN_H
#include
#include
#include
#include
#include
#include
#defineFrameWidth 2
#defineStep 5
#defineBaseFontHeight 16
#defineBaseLineLenght 5
#defineSpaceMargin 4
classQRect;
classQString;
classScreen:
publicQFrame{
Q_OBJECT
public:
Screen(QWidget*parent=0,constchar*name=0,Qt:
:
WFlagsflags=0);
voidanimate(doubley);
voidsetXTitle(QStringstr);
voidsetYTitle(QStringstr);
protected:
voidinitNumber(void);
voidinitCordinate(QPainter&p);
voidupdateCurve(QPainter&p);
virtualvoidshowEvent(QShowEvent*);
virtualvoidhideEvent(QHideEvent*);
QSizeminimumSize()const;
public:
doublenewY,oldY;
intnumXTicks,numYTicks;
QValueVector
boolfirstShow;
intsec,min,hour;
QPixmapsaveBuffer,newBuffer,midBuffer;
QRectrectCordinate;
QRectfromSaveRect;
QRecttoNewRect;
QRectrectYText;
QRectrectXText;
/*Weusethispaintertodraweveringonthenewbuffer.*/
QPainterdrawPainter;
QStringstringYTitle;
QStringstringXTitle;
};
#endif/*SCREEN_H*/
screen.cpp:
#include"screen.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
Screen:
:
Screen(QWidget*parent,constchar*name,Qt:
:
WFlagsflags):
QFrame(parent,name,flags|Qt:
:
WNoAutoErase)
{
setLineWidth(FrameWidth);
setFrameStyle(Panel|Sunken);
setBackgroundMode(Qt:
:
PaletteBase);
setSizePolicy(QSizePolicy:
:
MinimumExpanding,QSizePolicy:
:
MinimumExpanding);
firstShow=TRUE;
}
voidScreen:
:
showEvent(QShowEvent*)
{
if(firstShow)
initNumber();
initCordinate(drawPainter);
}
QSizeScreen:
:
minimumSize()const
{
returnQSize(20*SpaceMargin,20*SpaceMargin);
}
voidScreen:
:
hideEvent(QHideEvent*)
{
firstShow=FALSE;
}
voidScreen:
:
setXTitle(QStringstr)
{
stringXTitle=str;
}
voidScreen:
:
setYTitle(QStringstr)
{
stringYTitle=str;
}
voidScreen:
:
initNumber()
{
saveBuffer.resize(size());//setthesizeandthebackcolorof
saveBuffer.fill(this,0,0);//thosethreeQPixmapsassameastheScreen
newBuffer.resize(size());
newBuffer.fill(this,0,0);
midBuffer.resize(size());
midBuffer.fill(this,0,0);
drawPainter.begin(&newBuffer);
QRectnewWindow=drawPainter.window();
newY=0;
oldY=0;
sec=0;
min=0;
hour=0;
stringXTitle=QObject:
:
tr("Time(hh:
mm:
ss)");
Yval.push_back((double)oldY);
rectCordinate.setRect(
newWindow.topLeft().x()+FrameWidth+2*BaseFontHeight+2*BaseLineLenght,
newWindow.topLeft().y()+FrameWidth+2*SpaceMargin,
newWindow.width()-2*(FrameWidth+BaseFontHeight+BaseLineLenght+SpaceMargin),
newWindow.height()-2*(FrameWidth+BaseFontHeight+BaseLineLenght+SpaceMargin));
if(0!
=(rectCordinate.width()%(Step*Step)))
{
intx=rectCordinate.width()%(Step*Step); //((int)sqrt((float)Step));
rectCordinate.setWidth(rectCordinate.width()-x+1);
}
if(0!
=(rectCordinate.height()%(Step*Step)))
{
inty=rectCordinate.height()%(Step*Step);
rectCordinate.setHeight(rectCordinate.height()-y+1);
}
numXTicks=rectCordinate.width()/Step;
numYTicks=rectCordinate.height()/Step;
rectYText.setRect(newWindow.topLeft().x()+FrameWidth,newWindow.topLeft().y(+FrameWidth+2*SpaceMargin,BaseFontHeight,rectCordinate.height());
rectXText.setRect(rectCordinate.bottomLeft().x(),
newWindow.bottomLeft().y()-FrameWidth-BaseFontHeight,
rectCordinate.width(),BaseFontHeight);
fromSaveRect.setRect(rectCordinate.topLeft().x()+Step,rectCordinate.topLeft().y()+1,
rectCordinate.width()-Step-1,
rectCordinate.height()+2*BaseLineLenght+BaseFontHeight);
toNewRect.setRect(rectCordinate.topLeft().x()+1,rectCordinate.topLeft().y()+1,
rectCordinate.width()-Step-1,
rectCordinate.height()+2*BaseLineLenght+BaseFontHeight);
drawPainter.drawRect(toNewRect);
}
voidScreen:
:
initCordinate(QPainter&pCordinate)
{
if(firstShow)
{
pCordinate.setPen(Qt:
:
blue);
pCordinate.drawRect(rectCordinate);
this->setAttribute(Qt:
:
WA_PaintOutsidePaintEvent);//
inty0=rectCordinate.bottomLeft().y();
intx0=rectCordinate.bottomLeft().x();
intyText=0;
for(intj=0;j<=numYTicks;j++)
{
pCordinate.drawLine(x0-BaseLineLenght,y0,x0,y0);
if(0==j%Step)
{
pCordinate.drawLine(x0-2*BaseLineLenght,y0,x0-BaseLineLenght,y0);
pCordinate.save();
pCordinate.setPen(QPen(Qt:
:
blue,1,Qt:
:
DotLine));
pCordinate.drawLine(x0,y0,rectCordinate.bottomRight().x(),y0);
pCordinate.restore();
pCordinate.setPen(Qt:
:
black);
pCordinate.drawText(x0-2*BaseLineLenght-BaseFontHeight,
y0-2*BaseFontHeight+5*Step,BaseFontHeight,BaseFontHeight+Step,
Qt:
:
AlignCenter,QString:
:
number(yText));
yText+=10;
pCordinate.setPen(Qt:
:
blue);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- QT 编写 动态 曲线
![提示](https://static.bdocx.com/images/bang_tan.gif)