qt学习笔记
- 格式:pdf
- 大小:333.93 KB
- 文档页数:8
汇文教育; QFileInfo类
1、qfileinfo提供有关文件系统中的,文件的名称和位置信息(路径),它的访问
权限,以及它是否是一个目录或符号链接, 该文件的大小和最后修改/读取时间也可用。 2、QFileInFo 可以指向一个文件,一个相对或一个绝对文件路径,绝对文件路径开
始与目录分隔符“/”或驱动器的规格(除了在UNIX), 相对文件名开始有一个目录名或一个文件名,并指定一个相对于当前工作目录的路
径.一个绝对路径的一个例子是一个字符串“/tmp /qualtz”,相对路径
可能看起来像“src / fatlib”,你可以使用这个函数isrelative()来检查 qfileinfo 是否使用相对或绝对路径的文件,你可以调用函数converttoabs()
转换 qfileinfo 的相对路径为绝对路径。
这qfileinfo文件在构造函数中设置或后setfile(),使用exists()看文件是否存在,size()得到它的大小。 加速性能,qfileinfo缓存文件有关的信息,因为文件可以被其他用户或程序
更改,甚至由同一程序的其他部分,这个函数refresh(),刷新文件信息, 如果你想关闭一个qfileinfo的缓存和强制访问文件系统每次请求信息,你可以调用setCaching(FALSE). 文件的类型是获得通过isfile(),isdir()和isSymlink()
该文件的日期由 created(), lastModified() and lastRead(),文件的访问权限由 isReadable(), isWritable() and isExecutable()获得。
如果您需要读取和遍历目录,看QDir 类
Qt绘图: 1、当应用程序收到绘制事件时,就会调用Qwidget::painEvent(),该函数就是绘制窗
口的地方,
为了处理绘制事件,只需要重新写一个painEvent函数,并且在这个函数中实现一
个Qpainter对象进行绘制, 格式: class MyWidget :pubic QWidget { .... protected: void painEvent(QpainEvent*); } void MyWidget::painEvent(QpainEvent*) { Qpainter painter (this); .... .... }
update()函数,是进行界面重绘,既再一次调用一个void painEvent(QpainEvent*); 2、QPainter 类提供绘制操作。 其构造函数原型:QPainter(QPaintDevice * device)
QPaintDevice代表绘制2D图像的画布。
下面继承QPaintDevice的类的对象,都可以用于QPainter绘制 QWidget,QImage,QPixmap,QPicture,QPrinter, 3、Qt提供了4个处理图像的类,QImage,QPixmap,QBixmap,Qpicure.
QPixmap 是QPaintDevice的子类,因此可以用QPainter对其绘制。
只要用于屏幕绘制。 eg: QPixmap pix(200,200); //构建一个与给定的宽度和高度图。如果宽度或高度为零,空图构建。 pix.fill(Qt::red); //用指定的颜色填充的位图。
//通过调用这两个,就可以构建一个类似框架,但是还没有显示,要调用
QPainter类将其绘制出来,
//在屏幕上可以显示。 painter.drawPixmap(0,0,pix);
//在x,y出绘制Qpixmap类的对象.. eg2: QPainter painter(this); QPixmap pix(200,200); pix.fill(Qt::red); //背景填充为红色
QPainter pp(&pix); //新建QPainter类对象,在pix上进行绘图
pp.drawLine(0,0,50,50); //在pix上的(0,0)点和(50,50)点之间绘制直线 painter.drawPixmap(100,100,pix);
这里,我们有新建了一个QPainter类的对象pp,其中pp(&pix)表明,pp所绘
制的图都是在画布pix 上进行的, 注意: Qpainter painter(this),this指针指向类的当前对象,就表明了实在窗口上进行
绘图的,所以利用 painter进行绘图都是在窗口上的,painter进行的坐标变化,也是窗口的坐标系,而利用PP进行绘制的图,
都是在画布上进行的,如果他的坐标变化,就是画布的坐标系变化, 所以:所有的绘图设备都有自己的坐标系统,它们互不影响。
4、画鸭板
(1)、 我们在dialog.h里的public中再添加鼠标移动事件和鼠标释放事件的函数声
明: void mouseMoveEvent(QMouseEvent *); //mouse -->鼠标 void mouseReleaseEvent(QMouseEvent *); (2)、 在private中添加变量声明: QPixmap pix; QPoint lastPoint; QPoint endPoint; 因为在函数里申明的QPixmap类对象,是临时变量,不能存储以前的值,所以为
了实现保存上一次的绘画
结果,我们需要定义一个全局变量。 后面2个QPoint变量存储鼠标指针的两个坐标值,我们需要用这2个坐标值完成绘图。
(3)Qt鼠标事件 ①、QMouseEvent中的坐标 :QMouseEvent中保存了两个坐标,一个是全
局坐标,当然另外一个是局部坐标。 全局坐标(globalPos())即是桌面屏幕坐标(screen coordinates),这个跟
windows下的 调用getCursorPos函数得到的结果一致。
局部坐标(pos())即是相对当前active widget的坐标,左上角坐标为
(0, 0)。 ②、鼠标左键拖动和左键点击的判断 鼠标左键点击很容易判断,一般就是在重写mousePressEvent函数,示例如
下: void XXXWidget::mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton) { // todo ... } } 左键拖动的判断一般放在mouseMoveEvent函数中,但是你不能向上例一样
来判断,因为该函数的event参数总是返回Qt::NoButton。你可以这样做: void XXXWidget::mouseMoveEvent(QMouseEvent *event) { if(event->buttons() & Qt::LeftButton) { // todo ... } }
5、mousepressEvent()函数为鼠标的事件响应函数,QMouseEvent类的button()方法可以获得发生鼠标事件的
按键属性,如,左键,右键,中建, eg: void Dialog::mousePressEvent(QMousEvent *event) { QString str"(+QSring::number(event.x())","+QString::number(e->y()+")"; if(e->button()==Qt::LeftButton) { statusBur()->showMessage(tr("s鼠标按下时的位置:")+str) } else if(e->button()==Qt::RightButton) { statusBur()->showMessage(tr("s鼠标按下时的位置:")+str) } else if(e->button()==Qt::MidButton) { statusBur()->showMessage(tr("s鼠标按下时的位置:")+str)s } } 6、当我们想要绘制矩形的时候,这个是就要用到双缓冲绘图了,
如果将第一步中不用画布,直接在窗口上进行绘图叫做无缓冲绘图,
那么第二步中用了一个画布,将所有内容都先画到画布上,在整体绘制到窗口上,就该叫做单缓冲绘图,
那个画布就是一个缓冲区。这样,第三步,用了两个画布,一个进行临时的绘图,
一个进行最终的绘图,
这样就叫做双缓冲绘图。 在用双缓冲绘图时,我们要定义2个量
QPixmap tempPix; //临时画布
bool isDrawing; //标志是否正在绘图 if(isDrawing) //如果正在绘图 { tempPix = pix; //将以前pix中的内容复制到tempPix中,这样实现了
交互绘图 QPainter pp(&tempPix); pp.drawRect(x,y,w,h); painter.drawPixmap(0,0,tempPix); } else { QPainter pp(&pix); pp.drawRect(x,y,w,h); painter.drawPixmap(0,0,pix); }
然后在按下鼠标并且拖东鼠标的事件中,判断是否在绘图 void Dialog::mousePressEvent(QMouseEvent *event) { if(event->button()==Qt::LeftButton) //鼠标左键按下 { lastPoint = event->pos(); isDrawing = true; //正在绘图 } } 三、添加富文本 QTextDocument类,QLabel类,QTextEdit类支持富文本 html 语言, String "<b>Hello Qt!"