搜档网
当前位置:搜档网 › qt 学习笔记

qt 学习笔记

汇文教育;

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 "Hello Qt!"
b:表示粗体,(bold)
i:斜体 (italic)

eg:
setText("

hello " " Qt !

");

四、按下按钮后启动一个额外的应用程序(进程process)
QProcess类 用于启动一个外部的程序和他们进行通信。
(Inherits)继承:QIODevice

eg :
/* QProcess *myProcess = new QProcess(parent);
myProcess->start(program, arguments); //program 为QString 类
*/
QProcess *process = new QProcess;
QString starProgram = ui->cmdLineEdit->text();//取出LineEdit输入的文本。
process->start(starProgram.trimmed());//trimmed()函数为去除QString类字符后面的空格。
//首先是定义一个进程对象,在取得我们要启动的文本,最后在作为一个进程启动起来。
这个process会其找系统里面的环境变量去启动起来,


1、go to slot 添加一个槽函数,
2、定义一个#include 头文件
3、编写槽函数
五、LineEdit系统信号
QLineEdit的系统信号有:
Signals:
void cursorPositionChanged(int old, int new)//光标被改变
void editingFinished()//编辑完成发出信号
void returnPressed()//回车键按下发出信号
void selectionChanged()//选择区域变化
void textChanged(const QString & text)//文本被改变
void textEdited(const QString & text)//文本编辑发出

信号
实现:LineEdit在出入文本之前,确定按钮是灰色不可点击的,
在LineEdit输入内容后,按钮可点击的功能。
采用:LineEdit信号中的,textEdited()信号,在槽函数里写:
ui->submitButton->setEnaled(true)//使得button可使用。

实现:按确定按钮和按回车达到的效果是一样:
因此,我们要选择retuenPressed();回车键按下的时候发出一个信号,并且接收的槽函数,和点击
确定接收的槽函数一样。所以:既,两个不同的信号,指向同一个槽。
QObject::connect(ui->cmdLineEdit,SIGNAL(retuanPressed()),this,on_submitButton_clicked());
实现:启动一个应用程序后,关闭原来的,
在确定按钮的槽函数里写:
QProcess *process = new QProcess;
QString starProgram = ui->cmdLineEdit->text();//取出LineEdit输入的文本。
process->start(starProgram.trimmed());//trimmed()函数为去除QString类字符后面的空格。
ui->cmdLineEdit->clear();//将命令行的编辑器清空
this->close();//直接将这个进程结束掉,去运行我们打开的start();

六:
屏幕是1440*900
界面窗口是 451*226
move()函数:void move(int x, int y)
移动到某一个坐标位置,可以对每一个控件(按钮)而言,
也可是是对一个界面而言,不同的是,对象不一样,效果也不一样。
实现:界面窗口一运行就出现在某一个固定的位置:左下角
采用在构造函数里添加一个 move()函数,
this->move(0,900-226);//这样就出现在了左下角。

七:
要编译成其他版本的时候,必须要把一开始编译好的文件删除:将那些Debug 和 release 文件夹删除,
和其他一些文件删除。只保留一下这几个文件:
.pro, *.cpp , .ui , *.h 文件,

八 :
看某一个函数 重点是看2个内容,一个是传进去的参数, 另一个是返回值

计算器的实现:加法
eg:
int first = ui->firstLineEdit->text().toInt();
int Second = ui->secondLineEdit->text().toInt();
int result = first+Second;
ui->resultLineEdit->setText(QString::number(result));

number()函数为Int 类型转换为QString类型。

九 :
meta_Object system 元对象系统。
包含了信号的槽的内部机制,能够访问到QObject 子类的元对象信息功能
Q_OBJECT宏 申明了每一个QObject子类中必须首先得内省函数,
metaOBject(),tr(),qt_metacall()以及其他一些函数。
同时也提供额connect()与disconnect()这样的内省函数,

QComboBox QListWidget QTableWidget QTreeWidget 类都会有对应“项”的一个定义
item 项

项中的选择的第几项,可以由2中方法查看,一个是查看项中的文本,另一个就是项中的第几个下拉
列表框,从0开始。
分别是一下2个函数实现:
int currentIndex() const
QString currentText() const //返回值是QString 类型。

eg:if( ui->comboBox->currentIndex() == 0 )//下拉列表选择第0项。

QMessageBox :
提供一个modal dialog (模态对话框) :弹出一个对话框来,必须处理完这个对话框才能
去处理后面的程序。非模态: 就是弹出的对话框和父对话框可以同时处理,没有顺序。
提示一个警告信息:
QMessageBox::warning(this,"Error Message","Second Can't be Zeror ")
参数分别表示的意思是:
StandardButton QMessageBox::?warning(QWidget * parent, const QString & title,
const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)
第一个:对象
第二个:标题框中出现的QString
第三个:要警告的文本
调用information函数也是一样的;
QMessageBox::information(this,"Result","ui->resultLineEdit->text().number() ")

十 :
快捷键:文件(&F)
QAction 类
提供的信号有:
void changed()
void hovered()
void toggled(bool checked)
void triggered(bool checked = false)//当被点击一下的时候发出信号。

//如果当前textEdit文档的内容已经改变了,
if(ui->textEdit->document()->isModifed)
{ //和prentf(),或count<< "XXXX"函数一样。打印信息
qDebug()<<"current file modified"
ui->textEdit->clear();
this->setWindosTitle("Untitled.txt ------------xiedonghui")
}



相关主题