QT自学笔记——小白基础入门用

一、QT程序框架

未包含.ui文件时的情况

  1. main.cpp(程序主执行函数,创建一个自定义窗口类的对象,显示出来)
  2. 各个类的头文件.h和实现文件.cpp
    //qt creator 上创建项目时还会有.pro文件,但在vs 2017上并没有看到

创建项目时使用的基类:
1.简单窗口QWidget
2.带菜单栏的窗口QMainWindow(最常用)

另外,如果要在程序中实现输出功能,需要在头文件中包含<QDebug>
并且输出时的语句与C++中的cin类似,只不过cin对象变为了qDebug()。
如果想输出QString型的中文,需要在程序的头文件中添加如下代码:

#pragma execution_character_set("utf-8") 

QWidget类中的一些函数

 1. setWindowTitle() //接受Qstring类参数,设置窗口标题
 2. resize() //设置窗口大小	 
 3. hide()	//隐藏窗口
 4. show() 	//显示窗口
	注意:项目路径要纯英文,不能带中文

二、QWidget类的控件

窗口按钮

使用:包含头文件(qt5中为"qpushbutton.h"), 创建QPushButton类对象,即可创建按钮,但是需要为其指定父对象( 父对象和父类是两个概念,不要混淆)才能嵌进主窗口中,否则需要独立使用show()函数显示,且最终效果会悬浮作为独立窗口。父对象可以是窗口,也可以是按钮对象。

指定父对象的两个方法:
1.对QPushButton对象使用setParent()函数
2.在创建QpushButton对象时利用构造函数传参

QPushButton类已知的一些成员函数

 1. setParent()
 2. move()     //移动按钮在窗口的位置,默认为左上角
 3. setText()    //接受QString类型参数,修改按钮中显示的文本
 4. resize() //设置按钮大小
 5. setGeometry() //四个参数,前俩设置位置,后俩设置大小
 6. QPushButton()//最多两个参数,第一个为父对象指针,第二个为按钮中显示的文字

子窗口

在项目中添加QWidget类,另外写头文件和实现文件编写子窗口。 然后在主窗口类中添加该子窗口的一个对象即可, 但是光这么做编译器会提示“子窗口类没有合适的默认构造函数”, 解决方法为在子窗口实现文件中用explicit关键字显式定义默认构造函数。如:
explicit subWindowCon();

三、信号和槽函数

connect函数

connect( &发出信号的对象, &该对象所属的类::信号名, &接受信号的对象, &要执行的槽函数)

信号

QPushbutton已有的信号: void released、 void clicked 、void pressed、 void toggled
自定义信号的方法: 在类的头文件里面添加代码:

signals:
 void signalName();
 //信号没有返回值,但可以有参数在括号里面,只需在头文件中声明而不需要在实现文件(.cpp)中添加定义,
 //可以重载同名信号

让按钮散布信号而非针对性传播的方法: 在窗口头文件中声明自定义信号和散布函数,然后在窗口的实现文件中用下面语句:

connect( &button, &QPushbutton::clicked, this, &该窗口类名::散布函数);

然后散布函数的定义只需一句话:

emit signalName();

槽函数

槽函数可以是任何函数,但是类的成员函数时要加上类的作用域符号“: :"使用。

带参信号和槽函数

槽函数如果接受带参信号,信号的参数个数一定要不少于槽函数需要的参数个数,

QT 4版本中调用槽函数和信号的方法:
在connect函数中利用宏 SIGNAL和SLOT
具体方法示例:

connect( &subWin, SIGNAL(signalName(T1, T2)), this, SLOT(slotFunc(T1,T2)) );

并且槽函数还必须在类的头文件里面用slots关键字修饰,类似于信号signals:

public slots:
 void slotFunc( T1, T2);

但这么做编译器并不会对宏里面的代码进行自动检测,如果函数名或者参数变量有误时,只能编程者自己找出来。
qt5后,如果是重载信号,也可用下面方法来写,会简单些:

connect(ptrName, QOverload<argument>::of(&className::signalName),this,&className::slot);

如果想重载槽函数,就只能用qt4中的宏方法来写了。

C++11中的新特性——Lamda表达式与信号的结合

Lambda表达式

解释和用法——转自其他博客

在qt信号和槽中的使用:

connect(&信号发送者, &信号, [] () { 接受到信号后调用的代码 } );

该语句可以直接调用代码,而省略信号的接受者。如果调用的代码要用到外部变量或者对象成员等,可以在窗口类的构造函数中:

connect(&button, &QPushButton::released,[this](){ button.setText("123");} ) ;
//或者已有bPtr作为button的指针时:
//connect(bPtr, &QPushButton::released, [bPtr](){bPtr->setText("123");} ) ;

在方括号内填入不同符号有不同效果。
1.[var]表示值传递方式捕捉变量var;
2.[=]表示值传递方式捕捉所有父作用域的变量(包括 this);
3.[&var]表示引用传递捕捉变量var;
4.[&]表示引用传递方式捕捉所有父作用域的变量(包括 this);
5.[this]表示值传递方式捕捉当前的 this指针。

上面提到了一个父作用域,也就是包含Lambda函数的语句块,说通俗点就是包含Lambda的“{}”代码块。上面的捕捉列表还可以进行组合,例如:

1.[=,&a,&b]表示以引用传递的方式捕捉变量a和b,以值传递方式捕捉其它所有变量;
2.[&,a,this]表示以值传递的方式捕捉变量a和this,引用传递方式捕捉其它所有变量。

不过值得注意的是,捕捉列表不允许变量重复传递。下面一些例子就是典型的重复,会导致编译时期的错误。例如:

3.[=,a]这里已经以值传递方式捕捉了所有变量,但是重复捕捉a了,会报错的;
4.[&,&this]这里&已经以引用传递方式捕捉了所有变量,再捕捉this也是一种重复。

四、 QMainWindow类

菜单栏

要include头文件“qmenubar.h"、“qmenu.h”和"qaction.h", 前者为窗口顶部的菜单栏,第二个为点击菜单后出现的下拉菜单,第三个为菜单中的菜单项(动作)

在qmainwindow窗口中添加菜单栏的语句:

QMenuBar *barPtrName= menuBar();

在菜单栏中添加菜单的语句:

QMenu *menuPtrName= barPtrName->addMenu("菜单名“);

在菜单中添加菜单项(也被称为动作)的语句:

QAction *actionPtrName = menuPtrName->addAction("动作名");

连接动作和要执行的函数:

connect(actionPtrName, &QAction::triggered, []()
{
   /*代码块*/   
});
//triggered 是QAction类的内置信号

在菜单的行为选项之间添加分割线:

menuPtrName->addSeparator();

工具栏

可以通过点击工具栏的图标,直接执行菜单栏里面的某个特定动作,如“新建”和“打开”。
添加工具栏,要在头文件中include头文件"qtoolbar.h"。
然后用如下语句:

QToolBar *toolBarPtr = addToolBar("工具栏名字");

在工具栏中添加动作快捷键的语句为:

toolBarPtr->addAction(actionPtr);

如果已有QPushButton对象,且其指针为buttonPtr时,用该语句可以将该按钮设为工具栏中的按钮:

toolBarPtr->addWidget(buttonPtr);

状态栏

要include的头文件:“qstatusbar.h"
添加状态栏的语句:

QStatusBar *statusBarPtr=statusBar();

状态栏中添加标签
include头文件"qlabel.h"后,添加如下语句:

QLabel *labelPtr= new QLabel(this);
statusBarPtr->addWidget(labelPtr);

设置标签文本的语句:

labelPtr->setText("文本内容");

以上两段语句也可以用同一个语句实现:

statusBarPtr->addWidget(new QLabel("文本内容",this));

addWidget()函数添加控件顺序为从左往右,要想从右往左添加,使用函数addPermanentWidget()即可。

文本编辑区

要include的头文件:“qtextedit.h”
定义语句:

QTextEdit *textEditPtr = new QTextEdit(this);

核心控件

将控件放在窗口中间的语句:(以上面的文本编辑区为例)

setCentralWidget(textEditPtr);
//文本编辑区自带复制粘贴等右键功能,不需自己写

浮动窗口

头文件:“qdockwidget.h"
语句:

QDockWidget *dockWidgetPtr = new QDockWidget(this);
addDockWidget(Qt::RightDockWidgetArea, dockWidgetPtr);
/*
addDockWidget()函数有两个参数,第一个是浮窗在主窗口中的位置,
有Qt::LeftDockWidgetArea 、Qt::RightDockWidgetArea 、Qt::TopDockWidgetArea 、
Qt::BottomDockWidgetArea 、 Qt::AllDockWidgetArea 、Qt::NoDockWidgetArea六种;
第二个参数是浮窗的指针
*/

给浮窗内添加控件的语句:

dockWidgetPtr->setWidget(widgetPtrName);

模态对话框(打开后无法操作主窗口的对话框)

头文件:qdialog.h
创建和显示的语句:

QDialog dialogName;
dialogName.exec();//程序运行到这一句后会停在此处,关闭对话框才能执行后面代码

非模态对话框(打开后可操作主窗口的对话框)

头文件和创建语句与模态对话框一模一样,差别在于,显示对话框用的成员函数不是.exec(),而是.show(),

QDialog dialogName;
dialogName.show();

而这就导致程序运行不会终止,创建的对话框在函数结束后自动销毁,使用时看不到对话框的存在。
解决方法是,用指针和new命令来新建对话框。这样的话对话框会在整个程序结束后才自动执行delete关闭对话框:

QDialog *dialogPtrName = new QDialog(this);
dialogPtrName->show();

但是将delete放在整个程序结束后可能会导致程序运行时占用过多内存,所以也可以不给其指定父对象,而用下面的语句将其属性设定为“关闭时释放内存”:

dialogPtrName->setAttribute(Qt::WA DeleteOnClose);

也可以用如下代码指定对话框的模态/非模态属性:

dialogPtrName->setModal(true);//true为模态,false为非模态

标准对话框

已经添加好按钮的对话框,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值