Qt-学习笔记--里面包含了许多新手会碰到的问题还有一些方法的记录,可以收藏查阅。随时更新

目录

1:QDialog类说明

     在创建文件中,输入类信息时,基类要选择QDialog类,表明该类继承自QDialog类,使用这个类可以生成一个对话框界面。

2:快捷键说明:

3:创建一个简单的HelloWorld文件时,对于生成的左侧目录里面的文件进行说明:

 4:运行生成的文件夹中的.exe文件时报错,报缺少.dll结尾的文件,怎么解决?

5:程序编写好后,怎样发布到让别人电脑上面运行呢?

6:设置应用程序的图标:

 7:在Qt Creator 中用纯代码编写程序

8:查看想要查询的函数或者类名的方法:

 9:引用头文件时,用<>和“”分别代表了什么意思?

10:做项目工程中,日常碰到的错误解决方法:

11:设置窗口状态的函数: setWindowState()

12:窗口的几何布局需要分有框架和没有框架的两种类型

 13:Qt学习过程中,碰到的一些函数,关于它们的作用?

14:助记符来定位键盘焦点到对应的部件上的规则?

15:定位过滤器的使用方法?

16:网格布局函数gridLayout函数和设置间距的方法:

17:在设计界面时,用网格布局的时候,会碰见自己设计的按钮/标签的大小不符合自己的心意,那么应该怎么处理呢?

18:两个界面怎么进行切换?

19:在Qt中,用QLineEdit文本里面设置了一个数字,然后在两边设置了“+”和“-”按钮,怎么用这两个按钮控制文本里面的数字,对数字进行加减呢?

20: 给了一个按钮,一个LineEdit文件框,怎么点击一下按钮,文本框内的数字自动增加呢?

21:在想用lambda表达式的connect情况下,怎么做到多界面的参数传递呢?

 22:怎么用纯代码的形式设计一个能够嵌入方框左上角的方法?

23:设置了一个按钮后,并对按钮进行了命名,怎么把按钮上面文字的位置进行设置呢?

24: 自己设计了一个界面,有多个按钮,怎么在页面点击按钮后,原来设计的清空,变成自己点击按钮后的新页面呢《=》等同于怎么清空页面呢。

25:在用水平和垂直布局的时候,遇到里面设置的控件位置得不到自己想要,用了Qt:Align...都解决不了,现在有一种方式,能很好的解决问题。方式如下:

26:设置字体大小函数setPointSize()和像素大小 函数setPixelSize()的区别

27: QFont常用的函数属性:

28 qt中msleep、sleep、usleep函数的简单介绍

29 Qt中的显示函数show()和exec()函数的简单介绍:

 30 非模式对话框和模式对话框的个人理解:

1:QDialog类说明

     在创建文件中,输入类信息时,基类要选择QDialog类,表明该类继承自QDialog类,使用这个类可以生成一个对话框界面。

2:快捷键说明:

Ctrl + + :放大字体

Ctrl + - : 缩小字体

Ctrl + 0 :字体还原到默认的大小

Ctrl + R : 运行程序

Ctrl + S : 保存文件

Alt + 4 :显示编译输出信息

Ctrl + 空格 :强制代码补全

Ctrl + 2 :回到编辑模式

Ctrl + Shift + B : 构建工程

Ctrl + 5 : 进入项目模式

F5 : 调试

Alt + Enter键 : 弹出建联菜单

Ctrl + Shift + R : 出现替换栏

Ctrl + L : 对主界面进行垂直布局管理

Ctrl + K : 就会在定位器中显示各个过滤器的前缀及其功能

3:创建一个简单的HelloWorld文件时,对于生成的左侧目录里面的文件进行说明:

说明:

文件说明
helloworld.pro该文件是项目文件,其中包含了项目相关信息
helloworld.pro.user该文件包含了与用户有关的项目信息
hellodialog.h该文件是新建的HelloDialog类的头文件
hellodialog.cpp该文件是新建的HelloDialog类的源文件
main.cpp该文件中包含了main()主函数
hellodialog.ui该文件是设计师设计的界面对应的界面文件

 4:运行生成的文件夹中的.exe文件时报错,报缺少.dll结尾的文件,怎么解决?

解决方法:

一:将安装文件夹目录里面的bin文件夹中,把缺少的文件复制到需要运行的debug文件夹中。

二:将安装目录中的bin文件夹中路径,保存到环境变量中,方便运行时,自动查找文件路径。

5:程序编写好后,怎样发布到让别人电脑上面运行呢?

两种方式:

一:可以在桌面上新建一个文件夹,重命名为“我的第一个Qt程序”,然后将release文件夹中的helloworld.exe复制过来,再去Qt安装目录的 bin目录中将 libgce_s_dw2-l.dll,libstdc十十-6.dll,libwinpthread-l.dll,Qt5Core.dll,Qt5Gui.dll和 Qt5Widgets.dll这6个文件复制过来另外,还需要将安装目录中的5.6mingw49_32\plugins目录中的platforms 文件夹复制过来(不要修改该文件夹名称),里面只需要保留 qwindows.dll 文件即可。然后对其压缩,传送给别人即可。

二:可以在桌面上新建一个文件夹,重命名为“我的第一个Qt程序”,然后将release文件夹中的helloworld.exe复制过来,再在这个文件夹内按住shift健加上鼠标右击,打开该文件下的Powershell窗口,然后运行 windeployqt helloworld.exe即可完成打包。(注意:windeployqt 工具会将所有可用的文件都复制过来,有些可能是现在并不需要的,所以建议一般情况下不要使用,只有在无法确定程序依赖的文件时再使用该工具。

6:设置应用程序的图标:

1:首先在图标之家, 桌面图标,ICO,PNG图标,网页图标免费下zh 这个网站中下载自己想要的.ico结尾的图标,下载到自己电脑的桌面上,命名为:myico.ico

2: 将桌面的myico.ico文件复制到自己helloworld项目文件中。

3:打开helloworld.pro文件,在最后面添加下面一行代码: 

RC_ICONS = myico.ico

4:点击运行后,打开realease文件,发现自己的.exe文件图标变成了自己下载的那个

 7:在Qt Creator 中用纯代码编写程序

1:重新创建文件夹,选择其他项-----》选择空项目

2:在helloworld.pro中添加代码

//如果Qt 主版本大于4(也就是说当前使用的是 Qt5或者更高版本),则需要添加 widgets 模块
greaterThan(QT_MAJOR_VERSION,4): QT += widgets

3:创建一个源文件,命名为main.cpp,填写代码为:

#include<QApplication>
#include<QDialog>
#include<QLabel>
//前3行是头文件包含。Qt 中每一个类都有一个与其同名的头文件;
//因为后面用到了QApplication,QDialog和 QLabel这3个类,所以这里要包含这些类的定义。

int main(int argc, char *argv[]) //C+十中最常见到的 main()函数,它有两个参数,用来接收命令行参数
{
    //新建了QApplication类对象,用于管理应用程序的资源,任何一个Qt Widgets程序都要有一个QApplication 对象。
    //因为Qt程序可以接收命令行参数,所以它需要argc和argv两个参数。
    QApplication a(argc,argv);
    //新建了一个QDialog 对象,QDialog类用来实现一个对话框界面
    QDialog w;
    //设置对话框的宽和高
    w.resize(400,300);
    //新建了一个 QLabel对象,并将 QDialog 对象作为参数,表明了对话框是它的父窗口
    //也就是说这个标签放在对话框窗口中。
    QLabel label(&w);
    //移动对话框的位置
    label.move(120,120);
    //给标签设置要显示的字符第10行让对话框显示出来。
    //QObject::tr()函数可以实现多语言的实现
    label.setText(QObject::tr("Hello World! 你好 Qt!"));
    //在默认情况下,新建的可视部件对象都是不可见的,要使用show()函数让它们显示出来
    w.show();
    //让QApplication 对象进人事件循环,这样当Qt 应用程序运行时便可以接收产生的事件
    return a.exec();
}

8:查看想要查询的函数或者类名的方法:

将鼠标指针放到一个类名或函数上,则出现一个提示框显示其简单介绍。这时按下F1键就可以在编辑器右边快速打开其帮助文档。 

 9:引用头文件时,用<>和“”分别代表了什么意思?

用<>代表的意思是:

系统会到默认目录(编译器及环境变量、项目文件所定义的头文件寻找目录,包括 Qt安装的include目录。这是标准方式。

用双引号“”的意思是:

系统先到用户当前目录(即项目目录)中查找要包含的文件,找不到再按标准方式查找。

10:做项目工程中,日常碰到的错误解决方法:

1:运行项目时,会有“QApplication: No such file or directory ”的报错信息?

------解决方法:在项目里面的.pro文件中添加一行代码:

greaterThan(QT_MAJOR_VERSION,4): QT += widgets

2:出现“error: invalid operands of types '<unresolved overloaded function type>' and 'const char [8]' to binary 'operator<<' ”的报错信息?

------解决方法:出错的那行代码中,一个函数少加了括号。如下:

 3:出现“error : cannot convert 'QTextBlock' to 'QTextFrame*' in initialization
QTextFrame * childFrame = it.currentBlock();
”的报错信息?

-------解决方法:在报出错误的那一行代码中,一个函数写错了;订正如下:

QTextFrame *childFrame = it.currentFrame();
//是currentFrame(),不是currentBlock()

4: qt进行编译时,发生“error while building/deploying project....”的错误。

-------解决方法:

a.路径中含有中文名:
常见的就是项目拖到桌面,直接打开pro文件,如果 路径中有中文名,就会报错。
b.编译器选择了select all:
在打开项目选择编译器的界面,选择了安装的多个编译器。

5:报错好几个,比如有这些错误时,error:cannot initialize object parameter of type 'QWidget' with an expression of type 'MainWindow';error:no matching member function for call to 'connect';error:no matching constructor for initialization of ...

-------解决方法:

这些错误其实是版本冲突造成的,为了避免这些错误。在qt界面中,点击:帮助-》关于插件-》选择C++里面的ClangCodeModel->取消勾选-》重启即可。

6:报错:“DX9 Overlay is DISABLED”?

-----解决方法:

问题是Nvidia驱动496.13的问题,只要切换到旧版本就行啦。

8:报错:“QLayout: Attempting to add QLayout ““ to MainWindow ““, which already has a layout”。

----解决方法:其实是自己新建的对象缺乏了指针的问题。

比如:我的代码是:

QGridLayout myLayout = new QGridLayout (this);

这是时候就报错了,报错为:

conversion from “QGridLayout” to non-scalar type 'QGridLayout' requested

原因是myLayout缺乏指针,需要把变量声明为指针类型。

改正代码如下:

QGridLayout *myLayout = new QGridLayout (this);

9:报错信息:“QLayout: Attempting to add QLayout ““ to MainWindow ““, which already has a layout”;

-----解决方法:

报这个错误的原因是,在自己的界面中,以及存在了布局了,不能再布局了。、

举例:我的代码是

QGridLayout *myLayout = new QGridLayout (this);

运行后,报了如下错误:

QLayout:Attemping to add QLayout " " to MainWindow "MainWindow",which already has a layout

直接把this去掉,就能解决这个错误了,订正代码如下:

QGridLayout *myLayout = new QGridLayout ();

10:报错信息:‘Nothing to be done for ‘first‘’

------解决方法:

这个意思就是qt编译器提示说,现在的代码,前面已经全部运行了一遍,不需要再运行啦。想要运行的话,需要稍微修改修改。哪怕在代码里面加一个空格。

11:报错信息:'assignment of read-only variable 'falg''   In lambda function:

------解决方法:

这个报错信息,是因为在[=]()结构的lambda表达式里,在表达式里面对变量进行赋值的时候,设置的变量值是不能改变的,想要改变变量值,需要加入mutable关键字。举个例子:

开始我的代码是:
 

int a = 10;
connect(btn,&QPushButton::clicked,[=](){
        a = 20;
        count<<a;
});

这个时候就会报错:'assignment of read-only variable 'a'',lambda默认只读数据,加入mutable后,代码如下:

int a = 10;
connect(btn,&QPushButton::clicked,[=]()mutable{
        a = 20;
        count<<a;
});

这个时候,a的值就是20了。

注意:这个20,只能在这个connect函数范围内有效,脱离了connect这个范围后,a的值又是10,没有修改成20哦。如下:

int a = 10;
connect(btn,&QPushButton::clicked,[=]()mutable{
        a = 20;
        count<<a;
});
cout<<a;

第一a是20,第二个a是10;

题外话:我想找那种lambda表达式里面修改变量值后,不仅仅是局部有效,脱离connect后,在connect函数外也是被修改的值,但是我没有找到,要是有别的学习qt的人知道,麻烦请告知,互相交流学习哦

12 switch循环中报错:‘break’ statement not in loop or switch statement

-----解决方法:

     我也是被自己给傻到了,做到这里的时候,报错,我都难于理解。怎么找都找不到错误。最后一行一行看下去的时候。才发现忘记加{ }了。以下错误示范:
错误:

switch(flag)
case 1:
    printf("q");
    break;
case 1:
    printf("w");
    break;
case 1:
    printf("e");
    break;
case 1:
    printf("r");
    break;
default:
    break;

正确的:
 

switch(flag){
case 1:
    printf("q");
    break;
case 1:
    printf("w");
    break;
case 1:
    printf("e");
    break;
case 1:
    printf("r");
    break;
default:
    break;
}

13 添加图片资源时,运行的时候报错:“error: No rule to make target '../dream/res/??.png', needed by 'debug”

------解决方法:

原因:Qt找不到该文件了,所以就会出现编译错误的结果。最佳的方式是重新添加,删除原来的文件。

方法:第一步:如下图,打开你的Qt项目,找到.pro文件,双击打开,拉到最下面找见Resourse+=\的文字,删除边框里面的内容。之后保存crtrl+s。

 第二步:删除本地项目文件夹中的.qrc 文件和.user文件以及debug文件夹下所产生的的所有的内容,如下图红框里面的内容都删除。

 

 第三步:删除之后Qt会提示你是否保存还是关闭的按钮,选择关闭。
第四部:上面所有完成之后,关闭项目,再重新打开,重新添加图片就可以正常运行了。

11:设置窗口状态的函数: setWindowState()

  1. 最大化 Qt::WindowMaximized
  2. 最小化Qt::WindowMinimized
  3. 全屏显示Qt::WindowFullScreen
  4. 活动窗口Qt::WindowActive等
  5. 默认值为正常状态 Qt::WindowNoState

12:窗口的几何布局需要分有框架和没有框架的两种类型

 有框架的函数:

  • x()
  • y()
  • frameGeometry()
  • pos()和 move()等函数

没有框架的函数:

  • geometry()
  • width()
  • height()
  • rect()和 size()等函数

 13:Qt学习过程中,碰到的一些函数,关于它们的作用?

  • pos()函数:返回窗口的位置,是一个坐标值。
  • rect()函数:返回不包含边框的窗口内部矩形,窗口内部左上角是(0,0)点。
  • size()函数:返回不包含边框的窗口大小信息
  • width()函数:返回窗口内部的宽
  • height()函数:返回窗口内部的高

14:助记符来定位键盘焦点到对应的部件上的规则?

助记符就是我们所说的加速键。使用英文标签时,在字符串的一个字母前面添加“&.”符号,就可以指定这个标签的加速键是 Alt 加上这个字母;对于中文,需要在小括号中指定加速键字母 

比如:

英文:"&Button:"

中文:"数字选择框(&N):"

15:定位过滤器的使用方法?

“前缀符号十空格十+要定位的内容” 

16:网格布局函数gridLayout函数和设置间距的方法:

网格布局函数gridLayout函数:

QGridLayout::addWidget ( QWidget * widget, int row, int column, Qt::Alignment alignment = 0 )

row:行位置
column:列位置

alignment;对齐方式

void QGridLayout::addWidget(QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0)
This is an overloaded function.

6个参数表示控件名,行,列,占用行数,占用列数,对齐方式

注意:一般后面的对齐方式默认不写。

设置间距的方法:

gridLayout.setSpacing(value);
//value取整数值,即为int数值。

17:在设计界面时,用网格布局的时候,会碰见自己设计的按钮/标签的大小不符合自己的心意,那么应该怎么处理呢?

比如:在网格布局中,我们设置了一个标签,命名为label1,先需要写下一个代码,如下:

label1->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

这行代码的主要作用是将组件的大小可以进行扩展。

然后可以用以下函数进行设置一个固定的大小:

label1->setFixedSize(100,50);

18:两个界面怎么进行切换?


首先文件->新建文件夹->Application->Qt Widgets Application。命名啥的看自己,也可以跟着我命名,熟悉一下后面的界面切换流程。我这里命名的是MainWindow,基类就是mainwindow类型。

注意,我给代码上了注解,可以自己看注解,实现过程中,遇到难题的,可以留言,看到就回,随缘

1:首先的主界面的头文件代码为:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private:
    Ui::MainWindow *ui;
};
 
#endif // MAINWINDOW_H

2:对应的,主界面的源代码为:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include "submainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    //设置一个大小和窗口标题的窗口
    this->resize(800,600);
    this->setWindowTitle("登录");
    
    //创建一个子窗口
    SubMainWindow *s = new SubMainWindow();
    
    //创建一个按钮
    QPushButton *btn = new QPushButton("下一页",this);
    
    //监测按钮信号,随时跳转到新窗口
    connect(btn,&QPushButton::clicked,[=](){
        this->hide();
        s->show();
    });
 
 
    //监测窗口s的回退信号
    connect(s,&SubMainWindow::back,[=](){
        s->hide();
        this->show();
    });
 
}
 
MainWindow::~MainWindow()
{
    delete ui;
}

3:子界面的头文件代码(子文件的创建是:新建-》Qt-》Qt 设计师界面类    基类照样可以选择mainwindow类)

#ifndef SUBMAINWINDOW_H
#define SUBMAINWINDOW_H
 
#include <QMainWindow>
 
namespace Ui {
class SubMainWindow;
}
 
class SubMainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit SubMainWindow(QWidget *parent = 0);
    ~SubMainWindow();
 
signals:
    //创建一个信号
    void back();
 
private:
    Ui::SubMainWindow *ui;
};
 
#endif // SUBMAINWINDOW_H

4:子界面的源代码:

#include "submainwindow.h"
#include "ui_submainwindow.h"
#include <QPushButton>
 
SubMainWindow::SubMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::SubMainWindow)
{
    ui->setupUi(this);
    
    //建立一个有大小和有标题的子窗口
    this->resize(800,600);
    this->setWindowTitle("查询");
 
    //建立一个按钮
    QPushButton *btn = new QPushButton("back",this);
 
    //监测信号,当按下back信号的时候,会发出一个back信号
    connect(btn,&QPushButton::clicked,[=](){
        emit this->back();
    });
}
 
SubMainWindow::~SubMainWindow()
{
    delete ui;
}

 提示:多看多写,理清里面的逻辑关系

19:在Qt中,用QLineEdit文本里面设置了一个数字,然后在两边设置了“+”和“-”按钮,怎么用这两个按钮控制文本里面的数字,对数字进行加减呢?

 首先要建立信号和槽的链接,在头文件里面,设置两个槽,如下:

private slots:
     void reduce();
     void add();

然后针对这两个按钮,进行信号连接,假设两个按钮分别为(b1)和(b2),所以代码有:

connect(b1,SIGNAL(clicked()),this,SLOT(reduce()));
connect(b2,SIGNAL(clicked()),this,SLOT(add()));

接下来,在这两个槽函数中,分别对文本进行数据读取和增加减少操作,文本名假设为(lineEdit):

void MainWindow::reduce()
{
    int v = lineEdit->text().toInt();
    v -= 1;
    lineEdit->setText(QString::number(v));
}

void MainWindow::add()
{
    int v = lineEdit->text().toInt();
    v += 1;
    lineEdit->setText(QString::number(v));
}

20: 给了一个按钮,一个LineEdit文件框,怎么点击一下按钮,文本框内的数字自动增加呢?

不同于上面的点一次,加一次数字,这个是点一次,数字会一直增加。

这里需要用到定时器,如下:

connect(button,&QPushButton::clicked,[=](){  //按下按钮,传送信号
   QTimer *timer = new QTimer();
   timer -> setInterval(500); //定时器每500ms,开始定时,即每隔一段时间进行响应处理
   timer->start;
   connect(timer,&QTimer::timeout,[=](){  //每500ms,传送一次信号
         num++;
         lineEdit->setText(QString::number(num)); //将数值显示在lineEdit上面

         if(num >= 64)
         {
              timer->stop(); //停止定时
         }
     });
});

这里是主要的核心代码,像那些小细节方面的事情,比如按钮的创立,头文件的num的定义,就没有说了。默认是大家都明白的。

21:在想用lambda表达式的connect情况下,怎么做到多界面的参数传递呢?

这个本人在做小项目的时候,遇到的新手难题,在网上搜了很多,传递参数的三种办法啥的,还跟着几个博客敲了一遍,发现我还是用不了,明明函数里面定义好的变量,在编辑的函数中用的时候,就是提醒未定义变量,不在范围之类的错误。

后来花了一些功夫,在不影响自己原来的connect信号设定的前提下,用全局变量来进行参数的传递,能够完美的解决这个问题。(提示:我的是没有用ui进行设计的,都是纯代码) 

----------------------------------------------------在子界面中------------------------------------------------------

不用在.h的头文件中添加任何函数或者声明啥的,直接在子界面中的类函数外面添加代码:

QString str;

然后在子界面中的connect函数对str进行定义,比如我的按钮是btn,点击一下按钮,会对str进行赋值,代码如下:

connect(btn,&QPushButton::clicked,[=](){
     str = line->text();  //line是我给QLineEdit创建的一个变量名
     emit this->back();   //这个不用理会,是我项目中,返回主界面的一个信号
}

-------------------------------------------------------主界面---------------------------------------------------------

在主界面的.h头文件中,同样不需要设置任何啥的,在类外面写代码:

extern QString str;

用了extern 关键字,然后因为子界面已经定义过了,主界面也写了引用的代码,直接在主界面的主程序里面写入你想传递给别的函数名,有一点拗口,看我代码:

line2 -> setText(str);

我自己设置的一个QLineEdit的变量名,是在主界面中的,把子界面的参数直接传递给了主界面的line2函数里面了。

 22:怎么用纯代码的形式设计一个能够嵌入方框左上角的方法?

运行结果如图:

 有两种方式可以完成:

第一种:

先建立一个label,然后设置该标签下的QFrame中的frameShape格式为Box,设置frameShadow为Sunken,然后删除label文字,这样就得到了一个空方框。然后,再调出另一个label控件,然后选择autoFillBackground为true,并将此标签的位置调试到左上角,即完成嵌入的效果。

第二种:

比第一种简单,用QGroupBox 控件,代码如下:

头文件.h

#include <QGroupBox>
#include <QPushButton>
#include <QVBoxLayout>


private:
 QGroupBox *box;
 QPushButton *button;
 QVBoxLayout *vbox;

源文件.cpp

//实例 QGroupBox
    box = new QGroupBox(this);
    //位置、大小
    box->setGeometry(QRect(30,30,340,100));
    //标题
    box->setTitle("语音栏目");

23:设置了一个按钮后,并对按钮进行了命名,怎么把按钮上面文字的位置进行设置呢?

 这个不难,一句代码就能解决,假设按钮变量名为btn,则设置文字位置代码为:

btn->setStyleSheet("text-align:left") //靠左
btn->setStyleSheet("text-align:right") //靠右

24: 自己设计了一个界面,有多个按钮,怎么在页面点击按钮后,原来设计的清空,变成自己点击按钮后的新页面呢《=》等同于怎么清空页面呢。

这个不难,本文主要以网格布局的QGridLayout来说明,只要写入以下代码,就能完成页面的清空。

QGridLayout *myLayout = new QGridLayout();
if(myLayout)
{
   QLayoutItem *child;
   while(child = myLayout->takeAt(0)) != 0)
   {
       if(child->widget())
       {
           child->widget()->setParent(NULL);
       }
       delete child;
   }
}

25:在用水平和垂直布局的时候,遇到里面设置的控件位置得不到自己想要,用了Qt:Align...都解决不了,现在有一种方式,能很好的解决问题。方式如下:

 使用伸缩--addStretch 函数来解决位置问题。

-------------------------------------------------------------------------------------------------------------------------

居右:

QHBoxLayout *pHLayout = new QHBoxLayout();
pHLayout->addStretch(); // 添加伸缩
pHLayout->addWidget(pButton1);
pHLayout->addWidget(pButton2);
pHLayout->addWidget(pButton3);
pHLayout->addWidget(pButton4);
pHLayout->addWidget(pButton5);

效果图:

 -------------------------------------------------------------------------------------------------------------------------居中:

QHBoxLayout *pHLayout = new QHBoxLayout();
pHLayout->addStretch(); // 第一个控件之前添加伸缩
pHLayout->addWidget(pButton1);
pHLayout->addWidget(pButton2);
pHLayout->addWidget(pButton3);
pHLayout->addWidget(pButton4);
pHLayout->addWidget(pButton5);
pHLayout->addStretch(); // 最后一个控件之后添加伸缩
pHLayout->setSpacing(10);

效果图:

------------------------------------------------------------------------------------------------------------------------- 

均分:

QHBoxLayout *pHLayout = new QHBoxLayout();
pHLayout->addStretch();
pHLayout->addWidget(pButton1);
pHLayout->addStretch();
pHLayout->addWidget(pButton2);
pHLayout->addStretch();
pHLayout->addWidget(pButton3);
pHLayout->addStretch();
pHLayout->addWidget(pButton4);
pHLayout->addStretch();
pHLayout->addWidget(pButton5);
pHLayout->addStretch();
pHLayout->setSpacing(0);

效果图:

26:设置字体大小函数setPointSize()和像素大小 函数setPixelSize()的区别

setPixelSize()函数使用像素作为单位来设置字体大小

setPointSize()函数规定了实际中我们肉眼看到的字体的大小,与像素无关

使用setPixelSize函数设置大小,在像素大小不同的设备上显示的大小也不同

使用setPointSize函数设置大小,在不同设备上显示的大小是相同的

27: QFont常用的函数属性:

QFont常用属性

 描述
setFamily设置字体
setPixelSize设置字体像素大小
setBold字体加粗
setItalic斜体
setPointSize设置字体大小
setOverline上划线
setUnderline下划线
setStrikeOut删除线

28 qt中msleep、sleep、usleep函数的简单介绍

三个都是静态函数,引入头文件后可以直接调用,且精确度高,可以精确到微秒。

sleep的单位是秒。

msleep的单位是毫秒

usleep的单位是微秒

他们的作用作用是强制当前线程休眠

29 Qt中的显示函数show()和exec()函数的简单介绍:

show()函数:

 显示一个非模式对话框。控制权即刻返回给调用函数。弹出窗口是否模式对话框,取决于modal属性的值。

exec()函数:

显示一个模式对话框,并且锁住程序直到用户关闭该对话框为止。函数返回一个DialogCode结果。在对话框弹出期间,用户不可以切换同程序下的其它窗口,直到该对话框被关闭。

 30 非模式对话框和模式对话框的个人理解:

模式对话框:就是在弹出窗口的时候,整个程序就被锁定了,处于等待状态,直到对话框被关闭。这时往往是需要对话框的返回值进行下面的操作。如:确认窗口(选择“是"或“否”)。

非模式对话框:在调用弹出窗口之后,调用即刻返回,继续下面的操作。这里只是一个调用指令的发出,不等待也不做任何处理。如:查找框。

31 QPalette对应的函数作用的例子展示:

32  QString的arg方法

在QT的QString中,arg方法类似于C中的printf中使用的格式输出符(只是有点类似)。

在QT5的帮助文档中,可以看出以下几点:

  1. 使用arg(str1, str2, str3)这种方法进行替换。

  2. 使用arg(str1).arg(str2).arg(str3)这种方法进行替换。

  3. ​使用arg(int, int, int)这种方式进行替换。

解释以下两种方法:

一:使用arg(str1, str2, str3)

这种方法要求str1、str2、str3都为const QString &类型,即:

QString QString::arg(const QString & a1, const QString & a2, const QString & a3) const

同时,arg( )里的参数实现从1个到9个,也就是说最多只能有9个!即在实现中,arg的定义中参数最多的为:

QString QString::arg(const QString & a1, const QString & a2, 
                     const QString & a3, const QString & a4, 
                     const QString & a5, const QString & a6, 
                     const QString & a7, const QString & a8, 
                     const QString & a9) const

这也就意味着,如果有如下代码:

QString str = QString("%1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11").
              arg("1","2","3","4","5","6","7","8","9")

str将只会输出:

"1 2 3 4 5 6 7 8 9 %10 %11"

解决方法为在后面再加一个arg方法,放上后面两个对应的参数:

QString str = QString("%1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11").
              arg("1","2","3","4","w","6","7","8","9").arg("a","b");
//输出为:
// "1 2 3 4 5 6 7 8 9 a b"

注意:在QT5帮助文档中,给出了如下代码

QString str;
str = "%1 %2";
 
str.arg("%1f", "Hello");        // returns "%1f Hello"
str.arg("%1f").arg("Hello");    // returns "Hellof %2"

二.使用arg(str1).arg(str2).arg(str3)

这种方法其实前面用到了,如下面例子:

QString str=QString("%1 %2 %3 %4").arg("A").arg("B").arg("C").arg("D");
//str=="A B C D"

简单说就是挨着替换呗。但请注意下面的形式:

str = QString("%1 %2").arg("%1World", "Hello");
qDebug()<<str;
//输出为:"%1World Hello"
 
str = QString("%1 %2").arg("%1World").arg("Hello");
qDebug()<<str;
//输出为:"HelloWorld %2"
//第一个arg执行完后变为:QString("%1World %2").arg("Hello")
//再次执行后"Hello"替换的为%1

所以在使用多个arg( )连接时,一定要注意,前面连接使用的arg( )里如果有“%+数字”的情况,后面的arg( )会同样替换!

请注意下列例子:

str = QString("%1 %2").arg("%1World").arg("Hello");
//输出:"HelloWorld %2"
str = QString("%1 %2").arg("%2World").arg("Hello");
//输出:"HelloWorld Hello"
str = QString("%1 %2").arg("%3World").arg("Hello");
//输出:"%3World Hello"
str = QString("%1 %2").arg("%8World").arg("Hello");
//输出:"%8World Hello"
str = QString("%1 %6").arg("%3World").arg("Hello");
//输出:"HelloWorld %6"
str = QString("%2 %6").arg("%3World").arg("Hello");
//输出:"HelloWorld %6"
str = QString("%0 %6").arg("%3World").arg("Hello");
//输出:"HelloWorld %6"
str = QString("%-1 %6").arg("%3World").arg("Hello");
//输出:"%-1 HelloWorld"

arg( )里的参数在进行替换时,只会按照数字从小到大的顺序进行替换,只有比当前数字小的所有数字都替换完成了,才会替换当前数字,否则将当前数字和%按字符串处理。且数字为自然数!

三. 使用arg(int, int, int)

原型【1】为:

QString QString::arg(int a, int fieldWidth = 0, 
                 int base = 10, QChar fillChar = QLatin1Char( ' ' )) const

a:表示要处理的数字;fieldWidth:字宽;base:数字基数

如下列:

str = QString("十进制 63 的十进制为 %1")
            .arg(63, 0, 10);
//输出:"十进制 63 的十进制为 63"
str = QString("十进制 63 的十六进制为 %1")
            .arg(63, 0, 16);
//输出:"十进制 63 的十六进制为 3f"
str = QString("%1 %L2 %L3")
            .arg(12345)
            .arg(1987654321)  //根据结果,可知道这个L的作用
            .arg(12345, 0, 8); //但使用这种方式时,L失效
//输出为:12345 1,987,654,321 30071
//这里%L3的L没有任何作用

在原型【1】中的a的类型还可以是uint、long、double、udouble等数字的类型!

这里当a的类型为double时,原型为:

QString QString::arg(double a, int fieldWidth = 0, char format = 'g', 
                 int precision = -1, QChar fillChar = QLatin1Char( ' ' )) const

多了两个参数:format和precision,一个指明规格,一个指明精度。规格默认为 'g' 或 'G',指示后面的精度为整数和小数部分总和的长度;规格为'e'或 'E' 时,表示为科学记数法形式,精度部分指示的为小数部分的位数长度;规格为其他字符时,无作用,输出原double数字。如:

double d = 12.345689;
str = QString("delta: %1").arg(d, 0, 'g',4);
//输出为:"delta: 12.35"     ---这里进行了四舍五入
str = QString("delta: %1").arg(d, 0, 'G',5);
//输出为:"delta: 12.346"     ---这里进行了四舍五入
str = QString("delta: %1").arg(d, 0, 'e',4);
//输出为:"delta: 1.234e+01"
str = QString("delta: %1").arg(d, 0, 'E',4);
//输出为:"delta: 1.234E+01"
str = QString("delta: %1").arg(d, 0, 'r',4);
//输出为:"delta: 12.345689"
str = QString("delta: %1").arg(d, 0, 'Q',4);
//输出为:"delta: 12.345689"

33 QFileInfo类的使用

QFileInfo的几个构造函数:

QFileInfo ( const QString & file )

QFileInfo ( const QFile & file )

QFileInfo ( const QDir & dir, const QString & file )

QFileInfo ( const QFileInfo & fileinfo )

一般用法:

QFileInfo fileInfo(path);

//或者

QFileInfo fileInfo;

fileInfo.setFile(path);

bool             exists(); 判断文件是否存在,若存在返回true。

qint64           size(); 获取文件大小,返回bytes。

路径和文件名相关:

QString         path(); 返回文件路径,不包含文件名。

QString         filePath(); 返回文件路径,包含文件名。

QString         fileName(); 返回文件名称。

-----------------------------------------------------例子如下--------------------------------------------------------

QFileInfo fileInfo("/home/dipper/xyz.tar.gz");

fileInfo.path();        // returns "/home/dipper"

fileInfo.fileName();       // returns "xyz.tar.gz"

fileInfo.baseName();        // returns "xyz"

fileInfo.completeBaseName();       // returns "xyz.tar"

fileInfo.suffix();         // returns "gz"

fileInfo.completeSuffix();      // returns "tar.gz"

类型:

bool                     isFile(); 判断是否是文件。

bool                     isDir(); 判断是否是路径。

bool                     isSymLink(); 判断是否是符号链接。

QString         symLinkTarget(): 返回符号链接的文件

日期相关:

QDateTime   created(); 创建时间

QDateTime   lastModified(); 最近修改时间

QDateTime   lastRead(); 最近读时间

权限:

isReadable()

isWritable()

isExecutable()

所有者:

ower(), owerId(), group(), groupId(), permissions(),

permission(QFile::Permissions permissions)

dir(): 返回父目录

//下面三个都返回"~/examples/191697"

QFileInfo fileInfo1("~/examples/191697/.");

QFileInfo fileInfo2("~/examples/191697/..");

QFileInfo fileInfo3("~/examples/191697/main.cpp");

下面三个都返回"."

QFileInfo fileInfo4(".");

QFileInfo fileInfo5("..");

QFileInfo fileInfo6("main.cpp");

相对路径和绝对路径

QString absolute = "/local/bin";

QString relative = "local/bin";

QFileInfo absFile(absolute);

QFileInfo relFile(relative);

34: Qt中的“ :”和“ ::”的介绍:

“ :” :单个冒号。 一般指继承. Class 派生类 : 基类

“ ::”:双冒号。是作用域 作用域运算符 Qt::xxx。qt::xxx表示作用域qt中的名称xxx,qt可以是名字空间、类、结构;

  • 32
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值