一、QT基本框架
1、QT注意事项
QT文件路径必须要纯英文
2、QT类类型
- QMainWindow(带有菜单栏目)
- Qwidget(常用)
3、文件系统
main函数分析
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
\\有且只有一个应用程序对象
QApplication a(argc, argv);
\\继承于QMainWindow,为一个窗口
MainWindow w;
\\窗口默认隐藏,这里让他显示(可以用这个原理来设计隐藏窗口)
w.show();
\\a.exec()让用户输入,让窗口不会自动谈入
return a.exec();
}
/*为了让代码简便,我们将函数功能写在类中,一般不写入main函数中!!!!*/
二、项目文件
1、工程模块.pro
对于一个新的模块需要添加qmake,可以通过在头文件中按F1查找。例如
#include <QWidget> //需要添加QT += Widigets
这里的操作需要注意大小写以及+=符号的位置,否则会导致模块无法被识别
2、QT模块框架
- QT Widget:最常用
- Qt Webkit:浏览器引擎
- Qt Test:测试单元
- Qt SQL:数据库
- Qt Quick/Qt QML: JS实现单元
- Qt Multimedia Widget/Qt Mulitmedia:多媒体
- Qt Network:网络通信
三、QT项目
1、.pro 文件配置
Qt += widgets //指定这个为图形化界面编程,引用QWidget
2、main.cpp
#include <QApplication>
#include <QWidget> //窗口控件基类
int main(int *argc,char **argv)
{
QApplication app(argc,argv);
QWigets w;
w.setWindowTitle("这个标题"); //!!!!设置标题
w.show();
app.exec();
return 0;
}
四、父窗口与子窗口操作
1、按钮控件
#include <QPushButton>
- 定义:QPusheButton b;
- 设置标题:b.setText(Qstring str);
- 显示:b.show()
- 指定父对象:b.setParent(&w);
- 设置位置:b.move(100,100);
注意事项:
- 不用在构造函数中定义按钮,这样构造的按钮为局部变量,无法显示,应当在private 元素中定义
- 如果不指定父对象,那么按钮与界面将独立
2、两个独立窗口的定义
思路:在主窗口中定义一个private成员为subwindow类(继承于QWidget),在构造函数中定义利用show将其展示
窗口大小的定义:
resize(100,100);
五、信号与槽
为了让button在触发之后出现反应,我们需要用信号的形式传递出去
1、信号Signal
常用的信号:
- clicked
- released
- pressed
- toggled
自定义信号步骤:
- 在.h文件中的signals中定义信号名称
- 在调用中用emit mysignal()将信号发出
实例:
设计两个窗口,且每个窗口都有一个按钮时,我们希望按下按钮就可以切换到另外一个窗口,那么当子窗口切换到主窗口时无法发送信号,就需要自定义信号。
对于子窗口SubWidget中对象:
signal:
void mysignal;
void sendsignal()
{
emit mysignal();
}
在SubWidget.c中
/*此处b为SubWidget上面的按钮*/
connect(&b,&QPushButton::released,this,&SubWidget::sendsignal);
!!!关键词 emit 发送信号
信号的重载:
使用指向函数的指针进行实现!!
2、槽 slot
自定义槽步骤:
- 定义不同函数(任意成员函数,普通函数)
- 参数返回值为void
实例:
/*这里myslot为自己定义的槽函数*/
connect(&b,&QPustButton::released,&a,&MyWidget::myslot);
在MyWidget.h中:
public:
void myslot();
在MyWidget.cpp中:
void MyWidget::myslot()
{
//隐藏主窗口
this.hide();
//显示子窗口
b.show();
}
3、connect连接信号和槽
connect(信号发出方地址,signal,信号接收方,slot);
实例:
QPushButton b;
QWidget a;
b.setParent(&a);
/*因为一般写入构造函数,&a一般用this指针*/
connect(&b,&QPustButton::released,&a,&QWidget::close);
注意事项:注意在slot和signal的时候要写入全局变量的引用
4、Lamda表达式
前期准备:
在.pro 文件中要加入
CONFIG += C++11
使用方法:
connect(&b,&QPushButton:released,
[=]()
{
qDebug()<<"Lamda表达式";
}
)
六、坐标系统
move移动位置
七、带菜单栏的窗口(QMainWindow下)
1、菜单栏
//菜单栏
#include <QMenuBar>
#include <QMenu>
#include <QAction>
QMenuBar *MenuBar = menuBar(); //系统定义了menuBar()
//菜单
QMenu *PFile = MenuBar->addMenu("文件");
//添加菜单项(action)
QAction *PFile_new = PFile->addAction("新建");
QAction中的信号:
- changed
- hovered
- toggled
- triggered
处理代码
connect(PFile_new,&QAction::triggered,b,slot);//这里PFile_new为指针
2、工具栏
//工具栏添加快捷方式
#include <QToolBar>
#include <QPushButton>
QToolBar *toolBar = addToolBar("tool");
//添加快捷键
toolbar->addAction(PFile_new);
//添加小控件
QPushButton b;
b.setText("控件");
toolbar->addWidget(&b);
3、状态栏
#include <QStatusBar>
#include <QLabel>
{
QStatusBar *Sbar = statusBar();//以及定义
QLabel *label = new QLable(this);
label -> setText("Normal text file");
//addWidget从左往右添加
Sbar->addWidget(label); //或者 Sbar->addWidget(new QLabel("2",this));
//addPermanentWidget() 从右往左
}
4、文本编辑区
#include <QTextEdit>
QTextEdit *textedit = new QTextEdit(this);
setCentralWidget(textedit); //将文本编辑器放在中心
八、对话框
1、模态对话框
操作对话框同时无法操作之后的窗口
#include <QDialog>
{
QDialog dlg;
dlg.exec();
}
2、非模态对话框
操作时可以操作后面的窗口
#include <QDialog>
{
//dlg当做成员,防止释放
dlg.show();
}
3、标准对话框
是否/多个选项的对话框
#include <QMessageBox>
{
//关于对话框(一个选项)
QMessageBox::about(this,标题,内容);
//问题对话框(多个选项)
int re = QMessageBox::question(this,标题,内容,按钮1|按钮2|按钮3);
/*这个对话框可以通过int变量接收结果*/
switch(re)
{
case QMessageBox::Yes:
操作1;
case QMessageBox::No:
操作2;
}
}
4、文件对话框
#include <QFileDialog>
{
//获得文件名字
QString str = QFileDialog::getOpenFileName(
this,
"open", //标题
"../", //上一级路径
"Text(*.txt *cpp);;Image(*png *jpg);;all(*.*)" //指定文件类型
)
}
九、复习(notepad++界面项目)