QT画图
- 格式:doc
- 大小:59.50 KB
- 文档页数:8
qt画线函数Qt画线函数是一种用于在Qt应用程序中绘制直线的功能。
通过使用这些函数,开发人员可以轻松地在用户界面中添加线条,实现各种绘图效果。
在本文中,我们将探讨Qt画线函数的基本用法和一些常见的绘图技巧。
在Qt中,可以使用QPainter类来进行绘图操作。
要绘制直线,可以使用QPainter的drawLine函数。
该函数接受四个参数,分别是起始点的x坐标、y坐标,以及结束点的x坐标、y坐标。
通过指定这些参数,我们可以在界面上绘制一条直线。
下面是一个简单的示例,演示了如何在Qt窗口中绘制一条直线:```cppvoid MyWidget::paintEvent(QPaintEvent *event){QPainter painter(this);painter.drawLine(10, 10, 100, 100);}```在这个示例中,我们重写了QWidget的paintEvent函数,在该函数中创建了一个QPainter对象,并调用了drawLine函数来绘制一条从点(10, 10)到点(100, 100)的直线。
除了绘制基本的直线之外,Qt还提供了一些其他函数来实现更复杂的绘图效果。
例如,可以使用drawLines函数来一次绘制多条线段,或者使用drawPolyline函数来绘制一条折线。
此外,还可以使用setPen函数来设置画笔的样式,例如线条的颜色、宽度和样式。
另一个常见的绘图技巧是绘制带箭头的直线。
要实现这一效果,可以使用QPainterPath类来创建一个包含箭头形状的路径,然后使用drawPath函数在界面上绘制这条路径。
下面是一个示例代码:```cppvoid MyWidget::paintEvent(QPaintEvent *event){QPainter painter(this);QPainterPath path;path.moveTo(10, 10);path.lineTo(100, 100);// 添加箭头path.lineTo(90, 95);path.moveTo(100, 100);path.lineTo(95, 90);painter.drawPath(path);}```在这个示例中,我们首先创建了一个QPainterPath对象,并使用moveTo和lineTo函数来定义路径的形状。
Qt:QCustomPlot使⽤教程(⼆)——基本绘图0、说明本节翻译总结⾃:本节内容是使⽤QCustomPlot进⾏基本绘图。
本节教程都使⽤customPlot这个变量,它是⼀个指向QCustomPlot实例的指针,当然,在我们的项⽬中,我们更可能是通过ui->customPlot来访问这些QCustomPlot实例。
1、基本⽤法1.1、创建新画布customPlot -> addGraph();每个Graph及其上的线构成⼀幅图。
1.2、给画布分配数据点customPlot->graph(0)->setData(x,y)x、y是⼤⼩相等的⼀组数据,其中x中存储的是横坐标,y中存储的是纵坐标。
1.3、轴假设我们有两个QVector<double>,分别存放了⼀组点的x和y坐标(Key与Value)。
不过QCustomPlot更倾向于使⽤Key与Value⽽⾮x与y,这样可以更灵活地区分哪个轴具有什么样的功能。
所以当我们定义左边轴为Key轴⽽底部轴为Value轴时,我们就可以沿着左边的轴绘制⼀幅直⽴的图。
QCustomPlot有4个轴customPlot->xAxis, yAxis, xAxis2, 和 yAxis2,它们都是QCPAxis类型的,分别对应下、左、上、右。
如果要设置轴的范围为(-1,1),可以⽤:customPlot->xAxis->setRange(-1,1);1.4、重绘如果对画布做了任何修改,可以⽤customPlot->replot();进⾏重绘。
不过每当Widget被拉伸或者触发了内置⽤户交互时,都会⾃动进⾏重绘;这⾥的交互是指通过⿏标拖动坐标轴的范围、⽤⿏标滚轮缩放等。
1.5、例⼦绘制⼀个y=x2的曲线:QVector<double> x(101),y(101);for(int i=0;i<101;i++){x[i]=i/50.0-1;//设置x的范围为-1~1y[i]=x[i]*x[i];}//创建画布,设置画布上的点数据ui->customPlot->addGraph();ui->customPlot->graph(0)->setData(x,y);//设置坐标轴标签ui->customPlot->xAxis->setLabel("x");ui->customPlot->yAxis->setLabel("y");//设置坐标轴范围,以便我们可以看到全部数据ui->customPlot->xAxis->setRange(-1,1);ui->customPlot->yAxis->setRange(0,1);ui->customPlot->replot();坐标轴刻度、间隔和显⽰的数字是由axis ticker决定的,它是QCPAxisTicker类型的变量,通过xAxis->ticker()访问。
QT二维绘图8-1 用QPainter绘图(Painting with QPainter)要在绘图设备(paint device,一般是一个控件)上开始绘制,我们只要创建一个QPainter,把绘图设备指针传给QPainter对象。
例如:oid MyWidget::paintEvent(QPaintEvent *event){QPainter painter(this);...}使用QPainter的draw…()函数我们可以绘制各种图形。
图8.1给出了主要的一些。
绘制的方式由QPainter的设置决定。
设置的一部分是从绘图设备得到的,其他是初始化时的默认值。
三个主要的设置为:画笔,刷子和字体。
画笔用来绘制直线和图形的边框。
包含颜色,宽度,线型,角设置和连接设置。
刷子是填充几何图形的方式。
包含颜色,方式设置,也可以是一个位图或者渐变色。
字体用来绘制文本。
字体的属性很多,如字体名,字号等。
这些设置随时可以改变,可用QPen,QBrush,QFont对象调用setPen(),setBrush(),setFont()修改。
Figure 8.1. QPainter's most frequently used draw...() functionsFigure 8.2. Cap and join stylesFigure 8.3. Pen stylesFigure 8.4. Predefined brush styles现在来看看具体的例子。
下面的代码是绘制图8.5(a)中椭圆的代码:QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));painter.drawEllipse(80, 80, 400, 240);调用函数setRenderHint(QPainter::Antialiasing,true),使绘制时边缘平滑,使用颜色浓度的变化,把图形的边缘转换为象素时引起的扭曲变形尽可能减少,在支持这一功能的平台或者绘图设备上得到一个平滑的边缘。
QT实现在QLabel上画图QT之所以不能再任意控件上绘图是因为QT的事件过滤器把控件的绘图事件给过滤了。
在paintevent()函数中,通常需要设置QPainter对象,创建QPainter对象的同时需要指定绘图设备,即继承⾃QPainterDevice的⼦类作为绘图设备,绘制出来的图形将在这个设备上进⾏显⽰,Qt⼀共提供了4个这样的类,分别是QPixmap,QBitmap,QImage,和QPicture。
在控件上绘图⼜应该怎么办呢,我这以QLabel为例:使⽤事件过滤器来使QLabel对象捕获QEvent::Paint事件。
即,绘图函数不需要放在paintevent()函数中也可以实现绘图。
实现这个功能的主要函数就还是事件过滤器的两个重要函数,即installEventFilter()和eventFileter()#include "widget.h"#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);ui->label->installEventFilter(this); //这⾏不能省}Widget::~Widget(){delete ui;}bool Widget::eventFilter(QObject *watched, QEvent *event) //⽤过滤器eventFilter()拦截QLabel中的QEvent::Paint事件{if(watched ==ui->label && event->type() == QEvent::Paint)paint();return QWidget::eventFilter(watched,event);}void Widget::paint() //绘图{QPainter painter(ui->label);painter.setPen(Qt::blue);// painter.drawLine(100,100,200,200);painter.drawEllipse(30,15,50,65);painter.drawLine(0,100,111,100);}我在ui⾥添加了QLabel控件命名label,并且⽤样式表将label的背景变成⿊⾊⽅便观察,下⾯是效果图。
在前面的几节实验中,并没有涉及到与画图相关的内容,那是因为Qt 已经为我们做好了。
在本此实验中,我们将回到图形上来,考察一下基本的画图方法。
在一个窗口画图可以有不同的方法,最简单的方法是直接在窗口中放入一幅位图,这里不讨论这种方式。
另外一种是使用的基本的API 函数进行画线、画点操作。
:实验代码:drawdemo.h:#ifndef DRAWDEMO_H#define DRAWDEMO_H#include <qwidget.h>#include <qcolor.h>#include <qpainter.h>#include <qtimer.h>#include <qframe.h>#include <math.h>class DrawDemo: public QWidget{Q_O B J E C Tpublic:DrawDemo( QWidget *parent=0, const char *name=0 );protected:virtual void paintEvent( QPaintEvent * );private slots:void flushBuff();private:int buffer[200];QTimer *timer;QFrame *frame;};#endifdrawdemo.cpp:#define PI 3.1415926#include <stdio.h>#include "drawdemo.h"DrawDemo::DrawDemo( QWidget *parent, const char *name ):QWidget( parent, name ){setCaption( "OURS_qt_Example" );frame = new QFrame( this, "frame" );frame->setBackgroundColor( black );frame->setGeometry( QRect( 40, 40, 402, 252 ) );for( int i=0; i<200; i++ ) {buffer[i] = ( int )( sin( (i*PI) /100 ) * 100 );}QTimer *timer = new QTimer( this, "timer" );connect( timer, SIGNAL( timeout() ), this, SLOT( flushBuff() ) );timer->start( 30 );}void DrawDemo::flushBuff(){int tmp = buffer[0];int i;for( i=0; i<200; i++ ) {buffer[i] = buffer[i+1];}buffer[199] = tmp;repaint( 0, 0, 480, 320, TRUE );}void DrawDemo::paintEvent( QPaintEvent * ){frame->erase( 0, 0, 400, 320 );QPainter painter( frame );QPoint beginPoint;QPoint endPoint;painter.setPen( blue );for( int i=0; i<199; i++ ) {beginPoint.setX( 2*i );beginPoint.setY( buffer[i] +125 );endPoint.setX( 2*i+1 );endPoint.setY( buffer[i+1] +125 );painter.drawLine( beginPoint, endPoint );}}main.cpp:#include <qapplication.h>#include "drawdemo.h"int main( int argc, char **argv ){QApplication app( argc, argv );DrawDemo *drawdemo = new DrawDemo( 0 );drawdemo->setGeometry(10, 20, 480, 320 );app.setMainWidget( drawdemo );drawdemo->show();int result = app.exec();return result;}实验原理:一行一行的解释,在drawdemo.h 中,在protected 成员中:virtual void paintEvent( QPaintEvent * ),在前面介绍QEvent 的时候,我们曾经提及到QPaintEvent。
QtQPainter的使⽤及矩形、圆形等常见图形的画法1 #include<QApplication>2 #include <QWidget>3 #include <QPainter>4class MyMainWindow:public QWidget5 {6public:7 MyMainWindow(QWidget *parent = 0);8private:9void paintEvent(QPaintEvent*);10 QPainter *paint;11 };121314void MyMainWindow::paintEvent(QPaintEvent*)1516//paintEvent函数由系统⾃动调⽤,⽤不着我们⼈为的去调⽤。
17 {18 paint=new QPainter;19 paint->begin(this);20 paint->setPen(QPen(Qt::blue,4,Qt::DashLine));//设置画笔形式21 paint->setBrush(QBrush(Qt::red,Qt::SolidPattern));//设置画刷形式22 paint->drawRect(20,20,160,160);23 paint->end();24 }252627 MyMainWindow::MyMainWindow(QWidget*parent):QWidget(parent)28 {29 setGeometry(100,100,200,200);30 }313233int main(int argc,char**argv)34 {35 QApplication a(argc,argv);36 MyMainWindow w;37 w.show();38return a.exec();39 }绘制圆和椭圆核⼼代码:1 paint->setPen(QPen(Qt::blue,4,Qt::SolidLine));2 paint->drawEllipse(20,20,210,160);第1,2个参数分别表⽰圆/椭圆距左上⾓的像素数。
Qt Custom Plot 是一个强大的图形绘制库,用于在Qt 应用程序中绘制各种图形。
要在Qt Custom Plot 中绘制sin 和cos 曲线,你需要使用QCPGraph 类。
以下是一个简单的示例代码,展示了如何在Qt Custom Plot 中绘制sin 和cos曲线:cpp复制代码#include"mainwindow.h"#include"ui_mainwindow.h"#include"qcustomplot.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){ui->setupUi(this);// 创建 QCustomPlot 实例QCustomPlot *customPlot = new QCustomPlot(ui->centralWidget);ui->verticalLayout->addWidget(customPlot);// 创建数据序列QVector<double> x(100); // x 数据点数量为 100QVector<double> siny, cosy; // sin 和 cos 的 y 数据点for (int i=0; i<100; ++i){x[i] = i/50.0 - 1; // x 范围从 -1 到 1,步长为 0.2siny << qSin(x[i]*2*M_PI); // 计算 sin 值cosy << qCos(x[i]*2*M_PI); // 计算 cos 值}// 创建图形并添加数据序列QCPGraph *graph = customPlot->addGraph();graph->setPen(QPen(Qt::black));graph->addData(x, siny);graph->addData(x, cosy);// 设置坐标轴范围以适应数据customPlot->rescaleAxes();}这个示例创建了一个QCustomPlot 实例,并添加了两个数据序列(sin 和cos)。
Qt5绘制仪表盘dashboard说明本⽂演⽰Qt 版本: Qt5.14.本⽂将使⽤QPainter ⼀步⼀步绘制仪表盘:刻度、指针、刻度值注意: 绘制顺序,如果先绘制,则后来绘制的将会覆盖住先前绘制的。
如果需要绘制半透明, 请设置QColor 的第四个参数 alpha , 范围: 0~255, 0 - 全透明, 255-不透明样式⽐较粗糙, 后⾯在优化这是⼯作上遇到的需要绘制的图形。
蓝⾊的是指针indicator 下⾯⼀步⼀步开始绘制开始前之前重写函数paintEvent( QPaintEvent *event )。
QtGuiApplication1继承⾃QWidget.设置反⾛样(抗锯齿)绘制圆代码效果 QPainter painter( this );painter.setRenderHint( QPainter::Antialiasing, true);void QtGuiApplication1::draw_ellipse_( QPainter& painter ){painter.save();/// -----------------------------------------------------------------/// 设置画笔颜⾊painter.setPen(QPen(QColor(100, 200, 100), 2));/// 直接绘制圆painter.drawEllipse( circle_config_.start_x_, circle_config_.start_y_,circle_config_.radius_ * 2, circle_config_.radius_ * 2 );/// -----------------------------------------------------------------painter.restore();}绘制刻度每10度绘制⼀个刻度线,每30度绘制⼀个较长的刻度线代码void QtGuiApplication1::draw_dial_( QPainter& painter ){painter.save();painter.setPen(QPen(QColor(200, 100, 200), 2));/// 旋转坐标/// 第⼀个参数:坐标起点X/// 第⼆个参数:坐标起点Y/// 第三个参数:相对当前坐标系向⽬标坐标系需要旋转多少度/// 第四个参数:是否绘制较长的刻度auto draw_dial = [&]( const double& xxx, const double& yyy, const double& angle, const bool& is_longer ){int dial_len = 8;if (true == is_longer)dial_len = 30;/// 重置坐标系painter.resetTransform();/// 将其移动到⽬标点painter.translate(xxx, yyy );/// 再旋转指定⾓度painter.rotate( angle );/// 绘制刻度painter.drawLine( QLine(QPoint(0, 0), QPoint(-dial_len, 0)) );};/// 圆。
qt画多边形(实现⿏标拖动节点)---恢复内容开始---2018-01-06这个⼩例⼦实现了移动⿏标,⿏标的坐标信息跟随⿏标移动,多边形的实现,⿏标点击可以拖动多边形点的位置,(其中有个问题?我在QMainWindow下,⽤mouseMoveEvent事件,只有⿏标点击移动才会有效,不知道是qt的原因,还是我实现的问题,知道的可以给我留⾔,谢谢)以下是基于widget类实现的不会存在那个问题()widget.h#ifndef WIDGET_H#define WIDGET_H#include <QWidget>namespace Ui {class Widget;}class Widget : public QWidget{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();void init(); //初始化数据的函数protected:void paintEvent(QPaintEvent *event); //绘图事件void mouseReleaseEvent(QMouseEvent *event);//⿏标释放事件void mousePressEvent(QMouseEvent *event);//⿏标单击事件void mouseMoveEvent(QMouseEvent *event);//⿏标移动事件void mouseDoubleClickEvent(QMouseEvent *event);//⿏标双击事件private:Ui::Widget *ui;int x[5]={17,89,199,277,100},y[5]={150,93,49,127,300}; //定义多边形的5个点int m,m_mouse_style,j;};#endif // WIDGET_Hwidget.cpp#include "widget.h"#include "ui_widget.h"#include <QToolTip>#include <QMouseEvent>#include <QDebug>#include <QPainter>#include <QPaintEvent>#include <QWhatsThis>#include <QPen>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);setMouseTracking(true);init(); //初始化数据}Widget::~Widget(){delete ui;}void Widget::init(){m=0; //为所有的全局数据初始化增加程序的鲁棒性m_mouse_style=0;j=0;}void Widget::mouseMoveEvent(QMouseEvent *event){m=0; //还应该在这在给m 赋⼀次值为了清空⿏标上⼀次在某个点上留下的值QString zuo=QString("%1 %2").arg(event->pos().x()).arg(event->pos().y());QToolTip::showText(QPoint(event->globalPos()),zuo,this); //显⽰⿏标坐标更随⿏标⽤⽅框的形式//在mainwindows 这个类中⽤ mouseMoveEevent 事件只有点击拖动⿏标时才会有效不知道是什么原因 for(int i=0;i<5;i++){if(fabs(event->pos().x()-x[i])<=5&& fabs(event->pos().y()-y[i])<=5){//fabs()这个函数是⽤来去绝对值的m=m+1;}}if(m!=0){setCursor(Qt::CrossCursor); //改变⿏标的样式update(); //刷新}else {setCursor(Qt::ArrowCursor);update();}if(m_mouse_style==1){ //改变点的位置x[j]=event->pos().x();y[j]=event->pos().y();update();}}void Widget::mousePressEvent(QMouseEvent *event){if(event->button()==Qt::LeftButton){ //判断是否是左键点击for(int i=0;i<5;i++){if(fabs(event->pos().x()-x[i])<=5&& fabs(event->pos().y()-y[i])<=5){//判断⿏标的位置j=i;m_mouse_style=1;setCursor(Qt::CrossCursor);break;}}}else {setCursor(Qt::ArrowCursor);}}void Widget::mouseReleaseEvent(QMouseEvent *event){// ⿏标释放事件 m_mouse_style=0;setCursor(Qt::ArrowCursor);update();}void Widget::mouseDoubleClickEvent(QMouseEvent *event){}void Widget::paintEvent(QPaintEvent *event){QPainter painters(this);QPen pen; //设置点的样式pen.setColor(Qt::red); //改变颜⾊pen.setWidth(5); //改变点的宽度painters.setPen(pen);QPoint point;for(int i=0;i<5;i++){ //画出5个点painters.drawPoint(x[i],y[i]);}QPen pen1; //设置线的样式pen1.setWidth(2);pen1.setColor(Qt::blue);painters.setPen(pen1);QPolygon ply; //多边形ply.setPoints(5,x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3],x[4],y[4]); //点的集合 painters.drawConvexPolygon(ply); //绘制出多边形}---恢复内容结束---。
qt 绘制波形曲线科学计数法
在Qt中绘制科学计数法的波形曲线可以通过使用QCustomPlot 库来实现。
首先,你需要确保已经在你的Qt项目中集成了QCustomPlot库。
然后,你可以按照以下步骤来绘制波形曲线:
1. 创建一个新的Qt窗口应用程序项目,并在项目文件中包含QCustomPlot库。
2. 在Qt的窗口类中,添加一个QCustomPlot小部件作为波形曲线的绘图区域。
3. 在窗口类的构造函数中初始化QCustomPlot小部件,并设置波形曲线的样式和属性。
4. 准备你的科学计数法数据,确保数据格式正确并且可以被QCustomPlot所接受。
5. 使用QCustomPlot的函数,比如addGraph()来添加波形曲线,并使用setData()来设置曲线的数据。
6. 可以设置坐标轴的标签和范围,以及其他样式属性,使得波
形曲线的显示符合你的需求。
7. 最后,显示窗口并运行程序,你就可以看到绘制出来的科学
计数法的波形曲线了。
需要注意的是,在设置科学计数法的数据时,要确保数据的精
度和范围都能够被正确地显示在波形曲线中。
另外,你也可以根据
实际需求添加一些交互功能,比如放大缩小、鼠标悬停显示数值等。
总的来说,使用QCustomPlot库在Qt中绘制科学计数法的波形
曲线是一个相对简单而且灵活的方法,只要你熟悉了QCustomPlot
的基本用法,就可以轻松实现你的需求。
希望这些信息能够帮助到你。
在前面的几节实验中,并没有涉及到与画图相关的内容,那是因为Qt 已经为我们做好了。
在本此实验中,我们将回到图形上来,考察一下基本的画图方法。
在一个窗口画图可以有不同的方法,最简单的方法是直接在窗口中放入一幅位图,这里不讨论这种方式。
另外一种是使用的基本的A PI 函数进行画线、画点操作。
:实验代码:drawd emo.h:#ifndef D RAW DEMO_H#define DRAW D EMO_H#include <qwidget.h>#include <qcolor.h>#include <qpainter.h>#include <qtimer.h>#include <qframe.h>#include <math.h>class DrawDemo: public QWidget{Q_O BJ ECTpublic:DrawDemo( QWidget *parent=0, const char *name=0 );protected:virtual void paintEvent( QPaintEvent * );private s lots:void flushBuff();private:int buffer[200];QTimer *timer;QFrame *fra me;};#endifdrawdemo.cpp:#define PI 3.1415926#include <stdio.h>#include "drawdemo.h"DrawDemo::DrawDemo( QWidget *parent, const char *name ):QWidget( parent, name ){setCaption( "OURS_qt_Example" );frame = new QFrame( this, "frame" );frame->s etBackgroundColor( black );frame->s etGeometry( QRect( 40, 40, 402, 252 ) );for( int i=0; i<200; i++ ) {buffer[i] = ( int )( s in( (i*PI) /100 ) * 100 );}QTimer *timer = new QTimer( this, "timer" );connect( timer, SIGNA L( timeout() ), this, SLOT( flushBuff() ) );timer->start( 30 );}void DrawDemo::flushBuff(){int tmp = buffer[0];int i;for( i=0; i<200; i++ ) {buffer[i] = buffer[i+1];}buffer[199] = tmp;repaint( 0, 0, 480, 320, TRU E );}void DrawDemo::paintEvent( QPaintEvent * ){frame->erase( 0, 0, 400, 320 );QPainter painter( frame );QPoint beginPoint;QPoint endPoint;painter.setPen( blue );for( int i=0; i<199; i++ ) {beginPoint.setX( 2*i );beginPoint.setY( buffer[i] +125 );endPoint.setX( 2*i+1 );endPoint.setY( buffer[i+1] +125 );painter.drawLine( beginPoint, endPoint );}}main.cpp:#include <qapplication.h>#include "drawdemo.h"int main( int argc, char **argv ){QApplication app( argc, argv );DrawDemo *drawdemo = new DrawDemo( 0 );drawdemo->s etGeometry(10, 20, 480, 320 );app.s etMainWidget( drawdemo );drawdemo->s how();int result = app.exec();return result;}实验原理:一行一行的解释,在drawdemo.h 中,在protecte d 成员中:virtual void paintEvent( QPaintEvent * ),在前面介绍QEvent 的时候,我们曾经提及到QPaintEvent。
QPaintEvent 类包含了从画图事件传过来的事件参数。
private s lots:void flus hBuff();定义了一个私有槽,用于刷新缓存区。
int buffer[200]定义了一个缓存区,大小为200 字节,用于存储画图数据作为显存。
QTimer *timer;QTimer 类是Qt 中关于定时器的一个类,它提供了定时器信号和单触发定时器。
它在内部使用定时器事件来提供更通用的定时器(关于定时器事件,请参照:QTimer Event)。
QTimer 很容易使用:创建一个QTimer,使用start()来开始并且把它的timeout()连接到适当的槽。
当这段时间过去了,它将会发射timeout()信号。
注意当QTimer 的父对象被销毁时,它也会被自动销毁。
实例:QTimer *timer = new QTimer( myObject );connect( timer, SIGNA L(timeout()), myObject,SLOT(timerDone()) );timer->s tart( 2000, TRUE ); // 2 秒单触发定时器你也可以使用静态的s ingleShot()函数来创建单触发定时器,其详细定义为:void QTimer::s ingleShot ( int ms ec, QObject * receiver, const char * member )receiver 是正在接收的对象并且member 是一个槽。
时间间隔是ms ec。
这个静态函数在一个给定时间间隔之后调用一个槽。
使用这个函数是非常方便的,因为你不需要被timerEvent 或创建一个本地QTimer 对象所困扰。
实例:#include <qapplication.h>#include <qtimer.h>int main( int argc, char **argv ){QApplication a( argc, argv );QTimer::s ingleShot( 10*60*1000, &a, SLOT(quit()) );... // 创建并且显示你的窗口部件return a.exec();}这个示例程序会自动在10 分钟之后终止(也就是600000 毫秒)。
作为一个特殊情况,一旦窗口系统事件队列中的所有事件都已经被处理完,一个定时为0 的QTimer 就会到时间了。
这也可以用来当提供迅速的用户界面时来做比较繁重的工作。
QTimer *t = new QTimer( myObject );connect( t, SIGNA L(timeout()), SLOT(processOneThing()) );t->start( 0, FA LSE );myObject->process OneThing()将会被重复调用并且应该很快返回(通常在处理一个数据项之后),这样Qt 可以把事件传送给窗口部件并且一旦它完成这个工作就停止这个定时器。
这是在图形用户界面应用程序中实现繁重的工作的一个典型方法,现在多线程可以在越来越多的平台上使用,并且我们希望无效事件最终被线程替代。
注意QTimer 的精确度依赖于底下的操作系统和硬件。
绝大多数平台支持20 毫秒的精确度,一些平台可以提供更高的。
如果Qt 不能传送定时器触发所要求的数量,它将会默默地抛弃一些。
另一个使用QTimer 的方法是为你的对象调用QObject::startTimer()和在你的类中(当然必须继承QObject)重新实现QObject::timerEvent()事件处理器。
缺点是timerEvent()不支持像单触发定时器或信号那样的高级水平。
一些操作系统限制可能用到的定时器的数量,Qt 会尽力在限制范围内工作。
QFrame *fr ame;QFrame 类是有框架的窗口部件的基类。
它绘制框架并且调用一个虚函数drawContents()来填充这个框架。
这个函数是被子类重新实现的。
这里至少还有两个有用的函数:drawFrame()和frameChanged()。
QPopupMenu 使用这个来把菜单“升高”,高于周围屏幕。
QProgress Bar 有“凹陷”的外观。
QLabel 有平坦的外观。
这些有框架的窗口部件可以被改变。
QLabel label(...);label.setFrameStyle( QFrame::Panel | QFrame::Rais ed );label.setLineWidth( 2 );QProgress Bar pbar(...);label.s etFrameStyle( QFrame::NoFrame );QFrame 类也能够直接被用来创建没有任何内容的简单框架,尽管通常情况下,你要用到QHBox 或Q VBo x,因为它们可以自动的布置你放到框架中的窗口部件。
框架窗口部件有四个属性:frameStyle()、lineWidth()、midLineWidth()和margin()。
框架风格由框架外形和阴影风格决定。
框架外形有NoFrame、Box、Panel、StyledPanel、PopupPanel、WinPanel、ToolBarPanel、MenuBarPanel、HLine 和VLine,阴影风格有Plain、Rais ed 和Sunken。
线宽就是框架边界的宽度。
中间线宽指定的是在框架中间的另外一条线的宽度,它使用第三种颜色来得到一个三维的效果。