QT系列笔记总结

来源:互联网 发布:美国终身监禁知乎 编辑:程序博客网 时间:2024/06/06 12:54

知识点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);->设置前景颜色

 

实现定时器与路程的更改;