知识点1:
Qt Creator 编译的程序,在其工程文件夹下会有一个debug文件夹,其中有程序的.exe 可执行文件。但Qt Creator 默认是用动态链接的,就是可执行程序在运行时需要相应的.dll 文件。我们点击生成的.exe 文件,首先可能显示“没有找到mingwm10.dll,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。”表示缺少mingwm10.dll 文件。解决这个问题我们可以将相应的.dll 文件放到系统中。在Qt Creator 的安装目录的qt 文件下的bin 文件夹下(我安装在了D 盘,所以路径是D:\Qt\2009.04\qt\bin),可以找到所有的相关.dll 文件。在这里找到mingwm10.dll 文件,将其复制到C:\WINDOWS\system 文件夹下,即可。下面再提示缺少什么dll 文件,都像这样解决就可以了。
知识点2:MainWindow Framwork
知识点3:
单击.h中声明的函数,再右击可以选择重命名;双击.h中声明的函数,再右击可以选择在.cpp中声明此函数;
知识点4:QMessageBox的几种表达方法:
QMessageBox 可以弹出常见的4中对话框:禁止,消息,询问,警告
方法1:
Int ret=QMessageBox::warning(this,"ques","are you ok?"
,QMessageBox::Cancel | QMessageBox::Ok
,QMessageBox::Cancel);
switch(ret)
{
case QMessageBox::Ok:
function1();
break;
case QMessageBox::Cancel:
function2();
break;
default:;
}
方法2:
msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
msgBox.setText("Are you sure to start a new game?");
int ret=msgBox.exec();
switch(ret)
{
case QMessageBox::Ok:
function1();
break;
case QMessageBox::Cancel:
function2();
break;
default:;
}
方法3:
QMessageBox box;
box.setWindowTitle(tr("警告"));
box.setIcon(QMessageBox::Warning);
box.setText(curFile + tr(" 尚未保存,是否保存?"));
box.setStandardButtons(QMessageBox::Yes |QMessageBox::No);
if(box.exec() == QMessageBox::Yes)
{ function3(); }
实例1:多窗口
(Base class: Widget) :nGUI.pro
整个程序里,我们用两种方法实现了信号和槽函数的关联,
第一个按钮: 直接在设计器中实现其关联;
第二个按钮: 写了槽函数语句;
其实图形的设计与直接写代码效果是一样的。
这个程序里实现了两类窗口打开的方式,
一个: 自身消失而后打开另一个窗口;
1. 加上头文件#include” mydlg.h”
/*新建窗口的对象my1*/
myDlg my1;
if(my1.exec()==QDialog::Accepted)
//利用Accepted信号判断enterBtn 是否被按下
{
w.show(); //如果被按下,显示主窗口
return a.exec(); //程序一直执行,直到主窗口关闭
}
*****************************************************
错误代码1对比:
if(my1.exec()==QDialog::Accepted)
{
Widget w;
w.show();
}
return a.exec();
运行效果:
按下 进入键 后,主界面窗口一闪就没了。
代码分析:
w 是在if 语句里定义的,所以当if 语句执行完后它就无效了,
再次点击运行时,就会出现error:collect2: ld returned 1 exit
status 的错误。这是因为虽然主窗口没有显示,但它只是隐藏了,程序并没有
结束,而是在后台运行。
错误代码2对比:
Widget w;
if(my1.exec()==QDialog::Accepted)
{
w.show();
}
return a.exec();
运行效果:
在my1 对话框出现的时候不点enterBtn,而是直接关闭对话框,此时整个程序并没有结束执行,
return a.exec();一句表示只要主窗口界面不退出,那么程序就会一直执行。
一个: 是打开另一个窗口而自身不消失。
可以看到他们实现的方法是不同的。
实例2:添加菜单图标:
1.在Qt Creator 中添加资源文件,并且为菜单添加了图标;
2.在工具栏中添加图标,删除图标(remove action);
3.布局管理器与分裂器的区别;
布局管理器:它能使器件的大小随着窗口大小的改变而改变。
例如:(Text edit)
选中主窗口部件,然后在空白处点击鼠标右键,选择Layout->LayOut
in a Grid,??使整个主窗口的中心区处于网格布局管理器中。
或者选择工具栏中的栅格布局,有同样的效果;
运行一下程序,可以看到无论怎样拉伸窗口,文本编辑框的大小都会随之改变。
我们在这里一共讲述了三种使用布局管理器的方法,一种是去器件栏添加,一
种是用工具栏的快捷图标,还有一种是使用鼠标右键的选项。
实例3:实现文本编辑:
相关类学习:QFile
S1:在实例2的基础上,在信号与槽函数中添加简单的cut,copy,paste,
Undo,exit,clear功能;
其中,textEdit是从Input Widget中拖出的文本编辑框;
而textedit是 自定义类名(默认情况下是MainWindow)
先在main.cpp 文件中加入以下语句,让程序中可以使用中文。
在其中加入#include <QTextCodec> 头文件包含,
再在主函数中加入下面一行:QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
S2:
curFile = tr("未命名.txt");//初始化文件名为“未命名.txt”
setWindowTitle(curFile); //初始化主窗口的标题
S3: 主体设计
Bool isSave; //the label of text_save ,false->notsave,true->saved
curFile //thename of current file
Mainwindow :改变标题; setWindowTitle(curFile);
QFile:
QTextStream: 流操作类
QFileDialog 相关文件对话框类
QFileInfo -> QString;
1. new: 新建:
QMessageBox: 是否保存;改变isSave ,(saveOrNot)
->; Mainwindow :改变当前文件名称 标题(title);
-> textedit->clear();清空文件内容;
2. open-----------read()
QMessageBox: 是否保存;改变isSave ,(saveOrNot)
-> getopenFileName / getSaveFileName
->clear();
->loadFile();(QFileInfo:文件读取类)/saveFile QFile .,QTextString .open
**************************************************************************
QFileDialog类:
QString filename=QFileDialog:: getOpenFileName(…);
QFile file
file.open
QTextStream in(&file);
ui->textEdit->setText(in.readAll());
QFileInfo:文件读取类 :
QFileInfo filename;
QString curFile=
fileName.canonicalFilePath();
**************************************************************************
3. save------------------write()
**************************************************************************
QFile类,
QFilefile;
File.open();->false…
->success:
QTextStream流操作类
QTextStream out;
Out<<ui->textEdit->toPlainText(); 本形式输入流对象中;
QFileInfo:文件读取类 :
QFileInfo filename;
QString curFile=
fileName.canonicalFilePath();
**************************************************************************
4. saveAs
-> QMessageBox:是否保存;改变isSave,(saveOrNot);
->saveFile();
**************************************************************************
QFileDialog类:
QString filename=QFileDialog:: getOpenFileName(…);
=getSaveFileName(…);/*调出保存对话框*/
Filename.isempty();
Function:
Returns true if the string has no characters; otherwisereturns false.
**************************************************************************
实例5.实现文本查找:
QLineEdit类:
QDialog类:
QPushButton类:
QVBoxLayout类:
代码实现一个简单的查找对话框
实例6:实现状态栏的显示:
QLabel类
QStatusBar类
QFrame类
实例4:界面登入系统
1. 在登入按钮槽函数中,添加发送accept()信号函数;
若是添加的类是Dialog Withbutton,(系统自带accept(),reject()函数);
若是Dialog Without button(手动添加accept(),reject()函数);
voidloginDlg::on_loginBtn_clicked()
{
accept();
}
添加信号发送有两种方法:
一是右击转到槽;
二是直接在下方的信号与槽编辑器中选择;
2. 在main.cpp中加入函数:(上节已提到)
login mydlg;
if(mydlg.exec()==QDialog::Accepted)
{
w.show();
return a.exec();
}
3. 在login.cpp原基础上添加姓名与密码的认证:
if(ui->userLineEdit->text().trimmed()==tr("zxt")
&& ui->pwdLineEdit->text()==tr("123456"))
//判断用户名和密码是否正确
accept();
*********************************************************
各种字符类型间的转换:
ui->usrLineEdit->text()==tr("qt")
tr:将普通字符串转变成QString类型;赋值给lineEdit
int width=ui->lineEdit->text().toInt();
.toint:将从lineEdit中得到的QString类型转换为int型;
QString txt;
ui->lineEdit->setText(txt.setNum((width)));
setNum():将整形转换成QString类型;赋值给lineEdit
(ui->userLineEdit->text().trimmed()
QDateTime date=QDateTime::currentDateTime();
QString str=date.toString("yyyy-MM-dd hh:mm:ss dddd");
作用就是移除字符串开头和结尾的空白字符。
**********************************************************
else{
QMessageBox::warning(this,
tr("Warning"),
tr("user name orpassworderror!"),
QMessageBox::Yes);
//如果不正确,弹出警告对话框
}
ui->username->clear();
ui->code->clear();
ui->username->setFocus();将光标转到用户名输入框
}
4.
在login.cpp 的loginDlg类构造函数里,添上初始化语句,使密码显示
为小黑点。
loginDlg::loginDlg(QWidget *parent) :
QDialog(parent),
m_ui(new Ui::loginDlg)
{
m_ui->setupUi(this);
m_ui->pwdLineEdit->setEchoMode(QLineEdit::Password);
}
实例7:定时器
QTimer类:
BoolisActive()const;/*正在运行*/
Void stop();
信号:
Void timeout();
实例8:扫雷
setPixmap(QPixmap(":/photo/unknown.jpg"));,Item 的贴图;
ui->newgame->setIcon(QIcon(":/photo/face-smile.jpg"));菜单对newgame按钮贴图
实例9:绘图
QPainter类 图形绘制
QWidgetPaintEvent();绘图事件
Qt Color()颜色
QPen类 画笔
QBrush类 画刷
QLinearGradient类;确定一条直线
QRectF类 矩形;
setBackgroundBrush(Qt::black)->设置背景颜色;
setForegroundBrush(Qt::red);->设置前景颜色
实现定时器与路程的更改;