1、如何在QTCreater中像控制台一样输出文字:
头文件#include<QtDebug>
或者#include<QDebug>也可以
输出一行文字:qDebug()<<“shenzhen”;
2、什么是信号与槽?
信号:程序或按钮动作发出的信号
槽:就是响应信号的函数
3、如何自定义槽?(下面的例子使用系统自带的信号,使用自定义的槽)
(1)在头文件中声明一个槽
private slots:
voidchangeTitleSlot();
(2)在cpp实现文件中定义一个槽
void MainWindow::changeTitleSlot()
{
this->setWindowTitle(“liuzubing”);
}
(3)在cpp实现文件构造函数中使用信号连接一个槽
QObject::connect(ui->changeTitleButton,SIGNAL(clicked()), this, SLOT(changeTitleSlot()));
注意:后面必须为this,SLOT中必须为单个的函数,不能出现ui->changeTitleButton->setText(“测试”)这样的语句,不需要重新定义一个函数(槽),否则会出错,当然可以用系统自带的,只要是单个函数就可以。
定义槽一共有三种方法:第一种就是按照上述步骤,每一步不可或缺,第二种比如说按钮可以右键点击-》转到槽,可以省略第三步连接槽,第三种就是按下F4自动创建信号与槽之间的关系,按下F3返回信号与槽编辑模式,这种方法可以省略上述所有步骤。
4、如何自定义信号(下面的例子使用自定义的信号,使用系统自带的槽)
(1)在头文件中声明一个信号(注意signals前面没有权限修饰符private等关键字)
signals:
voidcustSignal();
(2)在cpp文件中发射这个信号,比如有一个按钮被按下就会触发这个信号
在按钮按下的槽中加入:
emit this -> custSignal();
定义了上述信号,就可以按照之前定义槽的方法中使用该信号。
例如已经定义了上述信号,在点击按钮的槽中加入了上述语句,当按钮点击的时候,当前对象就会触发custSignal()信号,可以使用这个信号,在构造函数中加入下列语句,实现关闭当前进程/或者当前ui窗口:
QObject::connect( this,SIGNAL(custSignal()), qApp, SLOT( quit() ) );
或者QObject::connect( this, SIGNAL(custSignal()), this, SLOT(close() ) );
5、水平布局与垂直布局快捷键Ctrl + H Ctrl + L
6、固定窗口大小添加代码方法:将窗口最大尺寸和最小尺寸设置相同的值:
在窗口的构造函数中加入:
this -> setMaxmumSize ( Width, Heigth);
this -> setMinmumSize ( Width, Heigth);
7、#include <iostream>与 #include <iostream.h>的区别,其实在iostream文件中就只包含了一句话,就是:
#include <iostream.h>
8、在Qt中启动一个额外的应用程序
头文件#include <QProcess>
例如当点击按钮的时候要启动一个应用程序,可以在点击按钮的槽中写:
QProcess *process = new QProcess; //实例化一个进程对象
QString str = ui -> lineEdit ->text() . trimmed() ; //从输入框获取一个字符串,并且去掉字符串的首尾空格
process –> start (str); //启动这个进程
思考:(1)在上述输入框中输入指令,如何在按下回车键的时候,启动进程?
解决方法:按下回车的时候,输入框会触发一个returnPressed()信号,直接将这个信号与按下上述按钮的槽连接就可以了。(输入框按下回车的returnPressed()信号和按钮按下的clicked()信号指向同一个槽。)
(2)在上述输入框没有指令的时候,让按钮为灰色不可操作,当输入有指令的时候,按钮正常可操作,如何实现?
解决办法:设置按钮可见函数 ui-> submitButton -> setEnabled (true); 不可见即改为false。
首先程序刚启动的时候,输入框没有字符,要在构造函数中设置按钮为灰色;当在输入框输入字符串的会触发输入控件的textChanged(QString)信号,在构造函数中将这个信号连接到一个槽,定义这个槽,读取输入框字符串,去掉首尾空格,看看是否为空,若为空,设置按钮为灰色,若不为空,设置按钮正常。
9、如何设置当前窗口在屏幕的位置?
解决方法:使用函数this -> move (x,y) x和y分别为窗口左上角在屏幕的坐标位置。
如果要窗口启动的时候设置,就可以把这句话加在构造函数中。(窗口的抖动就可以用这个来实现)
10、Qt中数值与字符串之间的转化
(1)将字符串转化为数值,QString类型的成员有一个转化为int型的函数。
QString str = “123”;
int a = str.toInt();
(2)将数值型转化为字符串,使用QString中的静态函数,如下:
int a = 123;
QString str = QString :: number(a);
11、如何使用MessageBox
包含头文件#include<QMessageBox>
在需要的地方调用静态方法:
(1)信息提示对话框:
QMessageBox::information(this,“title”,“information”));
(2)警告对话框:
QMessageBox::warning(this,“title”,“information”);
12、获取时间与日期
头文件:#include<QDateTime>
hh:mm:ss YYYY/M/dd 17:00:35 2017/12/11
yyyy-M-dd dd:mm:ss 2017-12-11 17:00:35
QDateTime currentTime =QDateTime::currentDateTime(); //获取一个当前的时间对象
QString time = current.toString(“yyyy-M-ddhh:mm:ss”); //将当前时间对象转化为字符串
13、程序启动动画
头文件:
#include<QSplash>
还需要一个图片类的头文件:
#include<QPixmap>
在main.cpp中添加代码,例如:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QPixmap pixmap(“:/splash.png”); //加载一张图片(实例化对象)
QSplashScreen splash(pixmap); //实例化一个对象(初始化屏幕)
splash.show(); //在屏幕中显示这张图片;
…
for(long index = 0;index<=1000000000 ; index ++);//进行一个延时
//让图片显示,也可以在这段时间让程序进行一些其他的初始化操作
…
MainWindow w;
splash.finish(&window); //初始化屏幕显示完成
w.show();
return a.exec();
}
14、使用默认浏览器打开一个网站
头文件:
#include<QUrl>
#include<QDesktopServices> //用于访问桌面服务的类
QDesktopServices::openUrl( QUrl(“http://www.baidu.com”)); //初始化一个Url类的实例,使用QDesktopServices类的静态方法打开这个连接,使用默认的浏览器
15、弹出一个自定义的子对话框
在工程文件上右键 -> add new … -> Qt -> Qt Designer Form Class -> ……..
对于这个子对话框的类可以自己改名。
然后对子窗口进行设计;
然后在主窗口需要的地方弹出这个子窗口即可。
弹出子窗口的方法:(假设子窗口类的名称为aboutDialog)
首先应该在主窗口的.h文件中包含子窗口类的头文件#include“aboutDialog.h”
aboutDialog *dlg = new aboutDialog; //实例化一个子窗口类的对象
dlg -> show(); //非模态的对话框,打开子窗口
也可以使用:dlg ->exec(); //模态窗口打开
非模态窗口与模态窗口区别:
模态窗口打开时,父窗口不能够操作,只有模态窗口关闭才能够操作父窗口。
非模态窗口情况下,各个窗口是相互独立的。
16、如何在窗口上显示一张图片、或者显示一个gif动图?
(1)可以显示的图像类型:BMP、GIF、JPG、JPEG、PNG、TIFF、PBM、PGM、PPM、XBM、XPM。
(2)如何显示图像:图片使用QLabel控件来进行显示,QLabel类含有setPixmap()函数可以用来显示图像,也可以直接用QPainter画出图像。如果图像过大,直接用QLabel显示,将会出现有部分图像显示不出来,这时可以用Scroll Area部件。方法:将QLabel部件放到ScrollArea部件里面,将两个采用栅格布局,当图像超出了QLabel部件大小时,就会产生滑动杆,这样图像就可以都看到了。
(3)显示的方法:先打开一个图像;将图像文件加载进QImage对象中;再用QPixmap对象获得图像;最后用QLabel选择一个QPixmap图像对象显示。
QString filename;
filename=QFileDialog::getOpenFileName(this,
tr("选择图像"),
"",
tr("Images (*.png *.bmp *.jpg *.tif *.GIF )"));
if(filename.isEmpty())
{
return;
}
else
{
QImage* img=new QImage;
if(! ( img->load(filename) ) ) //加载图像
{
QMessageBox::information(this,
tr("打开图像失败"),
tr("打开图像失败!"));
delete img;
return;
}
ui->label->setPixmap(QPixmap::fromImage(*img));
}
注:也可以直接用QPixmap类的对象采用Load函数加载图像。这里说下QImage和QPixmap类的用处:QImage为图像的像素级访问做了优化,QPixmap使用底层平台的绘制系统进行绘制,无法提供像素级别的操作,而QImage则是使用独立于硬件的绘制系统。
(4)图像的缩放
图像缩放采用scaled函数。函数原型
QImage QImage::scaled ( const QSize & size,Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationModetransformMode = Qt::FastTransformation ) const
使用方法如下,还是利用上面的img:
QImage* imgScaled= new QImage;
*imgScaled=img->scaled(width,
height,
Qt::KeepAspectRatio);
ui->label->setPixmap(QPixmap::fromImage(*imgScaled));
scaled函数中width和height表示缩放后图像的宽和高,即将原图像缩放到(width,height)大小。
(4)图像的旋转
图像旋转可以利用QImage类的transformed函数,向transformed函数传入QMatrix对象,QMatrix对象指定了旋转的角度。
代码如下:
QImage* imgRatate= new QImage;
QMatrix matrix;
matrix.rotate(270);
*imgRotate = img->transformed(matrix);
ui->label->setPixmap(QPixmap::fromImage(*imgRotate));
注意:rotate函数中参数是旋转的角度,旋转是按顺时针方向旋转的,上面顺时针旋转270度,即逆时针旋转90度。
(6)图像的连续缩放
有了图像缩放的基础,就可以实现图像的连续缩放,可以放置一个横向滑竿(中文解释不标准,就是Horizontal Slider部件 ),滑动滑轮的位置以实现图像连续缩放。
Horizontal Slider部件指向的值为整型value,即缩放后的图像为
img->scaled(orignalWidth*value/100,
orignalHeight*value/100,
Qt::KeepAspectRatio);
orignalWidth和orignalHeight为原始图像的宽和高。
注意:在对原始图像进行缩放多少倍数时,在相应的槽函数内只需要调用Horizontal Slider部件对象的setValue函数即可,因为Horizontal Slider部件滑竿指向的值一旦变化就会触发对应的槽函数来对图像进行缩放。
17、系统中有一些自带的事件、对应的事件处理函数,默认情况下这些事件处理函数不做任何操作。
如果想要使用,我们只需要将这些事件处理函数进行重写即可:包括以下几步:
(1)添加对应的头文件
(2)声明事件处理函数
(3)实现事件处理函数(系统自带的函数进行重写)
特别注意:
1)鼠标移动响应时间的时候,默认情况下必须要有鼠标键按下的同时,并且移动鼠标,事件才会响应(这种情况下,鼠标移动不受任何控件以及标题栏等影响,可以一直触发事件)。如果要设置为不需要按下鼠标,移动鼠标即可响应事件,可以在构造函数中添加setMouseTracking(true);(这种情况下,鼠标会受到控件,按钮标题栏等影响,在这些区域不能触发事件)
2)所有的事件处理函数声明,在头文件中不能放在槽的声明中,要单独拿出来,例如:
private:
voidmouseMoveEvent(QMouseEvent*event);
voidmousePressEvent(QMouseEvent*event);
(1)窗口关闭事件:
头文件:#include <QCloseEvent>
void closeEvent(QCloseEvent *event); //窗口关闭处理函数
(2)鼠标事件:
头文件:#include <QMouseEvent>
voidmousePressEvent(QMouseEvent*event); //单击处理函数
voidmouseReleaseEvent(QMouseEvent*event); //释放处理函数
voidmouseDoubleClickEvent(QMouseEvent*event); //双击处理函数
voidmouseMoveEvent(QMouseEvent*event); //移动处理函数
voidwheelEvent(QWheelEvent*event); //滑轮处理函数
槽的实现举例:
//鼠标按下事件
voidWidget::mousePressEvent(QMouseEvent*event)
{
//如果是鼠标左键按下 改变指针形状,并且存储当前指针位置与窗口位置的差值。
if(event->button()==Qt::LeftButton){
···
}
//如果是鼠标右键按下
elseif(event->button()==Qt::RightButton){
···
}
}
//鼠标移动事件 默认情况下,触发事件需要点击一下,才能触发。可设置为自动触发:setMouseTracking(true);
voidWidget::mouseMoveEvent(QMouseEvent*event)
{
//这里必须使用buttons()
if(event->buttons()&Qt::LeftButton){ //进行的按位与
···
}
}
//鼠标释放事件
voidWidget::mouseReleaseEvent(QMouseEvent*event)
{
···
}
//鼠标双击事件
voidWidget::mouseDoubleClickEvent(QMouseEvent*event)
{
//如果是鼠标左键按下
if(event->button()==Qt::LeftButton){
···
}
}
//滚轮事件
voidWidget::wheelEvent(QWheelEvent*event)
{
//当滚轮远离使用者时
if(event->delta()>0){
···
}else{//当滚轮向使用者方向旋转时
···
}
}
(3)键盘事件
头文件:#include<QKeyEvent>
voidkeyPressEvent(QKeyEvent*event); //按键按下处理函数
voidkeyReleaseEvent(QKeyEvent*event); //按键松开处理函数
槽的实现举例:
//键盘按下事件
voidWidget::keyPressEvent(QKeyEvent*event)
{
//是否按下Ctrl键 特殊按键
if(event->modifiers()==Qt::ControlModifier){
//是否按下M键 普通按键 类似
if(event->key()==Qt::Key_M)
···
}
elseQWidget::keyPressEvent(event); //保存默认事件
//如果是处理两个普通按键,得避免自动重复,释放中也要处理
if(event->key()==Qt::Key_Up){
//按键重复时不做处理
if(event->isAutoRepeat())return;
//标记向上方向键已经按下
keyUp=true;
}elseif(event->key()==Qt::Key_Left){
if(event->isAutoRepeat())return;
keyLeft=true;
}
}
//按键释放事件
voidWidget::keyReleaseEvent(QKeyEvent*event)
{
···
//如果是处理两个普通按键,得避免自动重复
if(event->key()==Qt::Key_Up)
{
if(event->isAutoRepeat())return;
···
}
elseif(event->key()==Qt::Key_Left)
{
if(event->isAutoRepeat())return;
···
}
}