栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Qt(c++)入门知识总结

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Qt(c++)入门知识总结

文章目录
      • 信号槽机制
      • .pro文件
      • 按钮(QPushButton)
      • Qt窗口坐标系
      • Lambda
      • QMainWindow
        • 菜单栏:
        • 工具栏
        • 状态栏
        • 铆接部件(浮动窗口)
        • 核心部件(中心部件)
        • 资源文件
        • 对话框
        • 布局管理
        • widget
        • QLabel
        • QLineEdit
        • 自定义控件
        • 消息机制和事件
        • event()
        • 事件过滤器
        • 文件系统

信号槽机制
信号槽机制是Qt框架的特色, 可以简单描述为,一个对象触发了一个信号,如果某个对象 对这个 信号感兴趣,那么就可以进行连接,当这个对象接收到这个信号后,可以做相应的处理,通常这种处理是交给槽函数来实现的。
// 信号槽的使用
// connect(sender,signal,receiver,slot)
// sender 信号发送者 signal 要发送的信号 receiver 信号接收者 slot 槽函数
class Teacher{
	// 自定义信号
	signal:
		// 注意 信号 只声明 不实现
		void hungry();
};
class Student{
	slots:
		// 槽函数
		void treat();
};
// 槽函数实现
void Student::treat(){
	qDebug() << "该吃饭了!";
}
// 触发信号方法
void MyWidget::classIsOver(){
	// 发送信号
	emit teacher ->hungry();
}
teacher = new Teacher(this); // this 添加children 表 方便回收
student = new Student(this); 
// 信号槽连接
connect(teacher,&Teacher::hungry,student,&Student::treat);

.pro文件
QT += core gui  # 项目包含的模块
greaterThan(QT_MAJOR_VERSION,4): QT += widgets # 大于Qt4版本才包含widget模块
TARGET=QfFirst # 生成的应用程序名称 Windows下是.exe 文件名称
TEMPLATE=app # 模板类型  应用程序使用的模板
SOURCES+=main.cpp  # 源文件
			mywidget.cpp
HEADERS += mywidget.h # 头文件

说明:
1. 注释 从# 开始直到 一行结束
2. TEMPLATE 模板变量告诉qmake 为这个应用程序生成哪种makefile

  • app 建立一个应用程序的makefile,这是默认值,所以如果这个模板没有被指定,这个将被使用
  • lib 建立一个库的makefile
  • vcapp 建立一个应用程序的VisualStudio项目文件
  • subdirs 这是一个特殊的模板,它可以创建一个能够进入特定目录并且为一个项目文件生成makefile 并且为它调用make的makefile
  1. TARGET 指定生成应用程序名:
  2. HEADERS 指定工程包含的头文件
  3. FORMS 工程中包含的 ui 设计文件
  4. SOURCES 工程中包含的源文件
  5. RESOURCES 工程包含的资源文件
  6. CONFIG += c++11 # 使用c++11的特性
按钮(QPushButton)
#include 
QPushButton *btn = new QPushButton;
// 设置父窗口
btn ->setParent(this);
// 设置文字
btn ->setText("文件");
// 移动位置
btn ->move(100,100)

QPushButton *btn2 = new QPushButton("哈比布",this);
// 重新指定窗口大小
this ->resize(600,400);
// 设置窗口标题
this ->setWindowTitle("第一个窗口");
// 限制窗口大小
this ->setFixedSize(600,400);
Qt窗口坐标系

以左上角为原点(0,0) X 向右增加 Y向下增加

Lambda

c++11 中的Lambda 表达式用于定义并创建匿名的函数对象
语法:


[] 函数对象参数 标识一个lambda 的开始 必须存在,函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。

  • 空 没有使用任何函数对象参数
  • = 函数体可以使用Lambda 所在作用范围内所有可见的局部变量,包括Lambda所在类的this,并且是值传递方式 相当于告诉编译器自动按值传递所有局部变量
  • & 告诉编译器按引用传递了局部变量
  • a 将a按值传递,按值传递时候,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的, 要修改a的拷贝 可以添加 mutable 修饰符
  • &a 将a 按引用传递
  • a,&b 将a 安值进行传递,b按引用传递
  • =,&a,&b 除了a和b 按引用传递外,其他参数都按值传递
  • &,a,b 除a和b 按值传递外,其他参数都按引用传递

mutable 可修改标识符:按值传递参数时,加上mutable 修饰符 可以安值传递进来的宝贝
函数返回值: -> 返回值类型 标识函数返回值的类型 当返回为void,或者只有一处 return的地方
{} 是函数体 这部分不能省略 但函数体可以为空

QMainWindow
QMainWindow 是一个为用户提供主窗口程序的类,包含一个菜单栏(men bar),多个工具栏(tool bars),多个铆接部件(dock widgets),一个状态栏 及一个中心部件(central widget),是许多应用程序的基础。
菜单栏:
一个主窗口最多只有一个菜单栏,位于主窗口顶部,主窗口标题栏下面
  • 创建菜单栏
QMenuBar *menBar() const
  • 创建菜单,调用QMenu成员函数 addMenu 来添加菜单
QAction* addMenu(QMenu *menu);
QMenu* addMenu(const QString &title);
QMenu* addMenu(const QIcon &icon,const QString &title);
  • 创建菜单项
// 调用 QMenu 的成员函数 addAction来添加菜单项
QAction *addAction(const QString &text);
// addSeparator  用于添加分隔线

工具栏
	主窗口的工具栏上可以有多个工具条。一般采用一个菜单对应一个工具条的方式,也可根据需要进行工具条的划分 QToolBar *toolBar = new QToolBar(this)  生成工具栏
  • 直接调用QMainWindow类的addToolBar() 函数获取主窗口的工具条对象,每增加一个工具条需要调用一次该函数
  • 插入工具条的动作,在工具条上添加操作,通过QToolBar 类的 addAction 函数添加
  • 工具条是一个可移动的窗口,它的停靠区由QToolBar 的 allowAreas 决定
    Qt::LeftToolBarArea 停靠在左侧
    Qt::RightToolBarArea 停靠在右侧
    Qt::TopToolBarArea 停靠在顶部
    Qt::BottomToolBarArea 停靠在底部
    Qt::AllToolBarAreas 以上四个位置都可停靠
    使用 setAllowedAreas() 函数指定停靠区域
    setAllowAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea)
    使用setMoveable() 函数设定工具栏的可移动性:
状态栏
  • 派生自QWidget 类,使用方法与QWidget 类似
  • 状态栏也最多有一个
QStatusBar *stBar = statusBar();
setStatusBar(stBar);
QLabel *label = new QLabel(提示信息,this);
stBar ->addWidget(label); // 添加提示信息到左侧
QLabel *label2 = new QLabel("右侧提示信息",this);
stBar ->addPermanentWidget(label2);
铆接部件(浮动窗口)
QDockWidget *dock = new QDockWidget("标题",this);
addDockWidget(Qt::BottomDockWidgetArea,dock);
// 设置停靠范围
dock ->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
核心部件(中心部件)
核心部件只能有一个,中心显示的部件都可以作为核心部件
QTextEdit *edit = new QTextEdit(this);
setCentralWidget(edit);
资源文件
Qt 资源系统是一个跨平台的资源机制,用于将程序运行时所需要的资源以二进制的形式存储与可执行文件内部。如果你的程序需要加载特定的资源(图标、文本翻译等),那么,将其放置在资源文件中,就不需担心这些文件的丢失。如果你将资源以资源文件形式存储,它是会编译到可执行文件内部。使用Qt Creator可以很方便地创建资源文件。我们可以在工程上点右键,选择添加文件,在Qt分类下找到Qt资源文件:


点击 “选择…” 按钮,打开 “新建Qt 资源文件” 对话框。在这里我们输入资源文件的名称和路径:

点击下一步,选择所需要的版本控制系统,然后直接选择完成。我们可以在Qt Creator 的左侧文件列表中看到 “资源文件” 一项,也就是我们新创建的资源文件:

右侧的编辑区有个"添加",我们首先需要添加前缀,比如我们将前缀取名为images。然后选中这个前缀,继续点击添加文件,可以找到我们所需添加的文件。

对话框
对话框是GUI 程序中不可缺少的组成部分,很多不能或者不适合放入主窗口的功能组件都必须放在、对话框中设置。对话框通常会是一个顶层窗口,出现在程序的最上层,用于实现短期任务或者简洁的用户交互。
 
布局管理 

widget
 
QLabel 
// 设置显示内容
void setText(const QString &);
// 普通字符串文本显示
QLable *lable = new QLable;
lable ->setText("hello world");
// 显示HTML字符串 比如超链接
label ->setText("百度一下");
//显示图片 setPixmap(QLabel成员函数) 设置图片
void setPixmap(const QPixmap &)
// 步骤
QPixmap pixmap // 定义QPixmap 图像
pixmap.load(":资源路");  //加载图片 指定资源路径 比如:/image/boat.jpg
// 将图片放置到QLabel 中
QLabel *label = new QLabel;
label.setPixmap(pixmap);

// 显示动画 只能用于gif 动画
void setMoive(QMovie *moive);
// 步骤
QMovie *movie = new QMovie(":/Mario.gif"); //定义QMovie 对象并初始化
movie ->start(); // 播放加载动画
// 将动画放置到QLabel 中
QLabel *label = new QLabel;
label ->setMovie(movie);
QLineEdit
// 提供单行文本编辑框
QString text() const; // 获取编辑框内容
void setText(const QString &); // 设置编辑框内容 
void setEchoMode(EchoMode mode); // 设置显示模式

自定义控件
// SmallWidget控件 继承自 QWidget
SmallWidget::SmallWidget(QWidget* parent):QWidget(parent){
	spin = new QSpinBox(this);
	slider = new QSlider(Qt:Horizontal,this);

	// 创建布局对象
	QHBoxLayout *layout = new QHBoxLayout;
	// 将控件添到布局中
	layout ->addWidget(spin);
	layout ->addWidget(slider);
	// 将布局设置到窗口中
	setLayout(layout);
	// 信号槽添加
	connect(spin,static_case(&QSpinBox::valueChanged),slider,&QSlider::setValue);
	connect(slider,&QSlider::valueChanged,spin,&QSpinBox::setValue);
}
消息机制和事件

class EventLabel : public QLabel{
	protected:
		void mouseMoveEvent(QMouseEvent *event);
		void mousePressEvent(QMouseEvent *event);
		void mouseReleseEvent(QMouseEvent *event);
};
void EventLabel::mouseMoveEvent(QMouseEvent *event){
	this ->setText(QString("
Press:(%1,%2)
").arg(QString::number(event ->x()),QString::number(event ->y()))); } void EventLabel::mousePressEvent(QMouseEvent *event){ this ->setText(QString("
Press:(%1,%2)
").arg(QString::number(event ->x()),QString::number(event ->y()))); } void EventLabel::mouseReleaseEvent(QMouseEvent *event){ QString msg; msg.sprintf("
Relese:(%d,%d)
",event ->x(),event ->y()); this ->setText(msg); } int main(int argc,char *argv[]){ QApplication *label = new EventLabel; EventLabel *label = new EventLabel; label ->setWindowTitle("MouseEvent~~~"); label ->resize(300,300); label ->show(); return 0; }
event()
bool CustomWidget::event(QEvnet *e){
	if(e ->type() == QEvent::KeyPress){
		QKeyEvent *keyEvent = static_case(e);
		if(keyEvent() ->key() == Qt::Key_Tab){
			qDebug() << "You press tab";
			return true;
		}
	}
	return QWidget::event(e);
}
事件过滤器
class MainWindow : public QMainWindow{
	public:
		MainWinow();
	protected:
		bool eventFilter(QObject *obj,QEvent *event);
	private:
		QTextEdit *textEdit;	
}
MainWindow::MainWindow(){
	textEdit = new QTextEdit;
	setCenterWidget(textEdit);
	textEdit ->installEvent(this);
}
bool MainWindow::eventFilter(QObject *obj,QEvent *event){
	if(obj == textEdit){
		if(event ->type() == QEvent::KeyPress){
			QKeyEvent * keyEvent = static_case(event);
			qDebug() << keyEvent ->key();
			return true;
		}else{
			return false;
		}
	}else{
		return QMainWindow::eventFilter(obj,event);
	}
}

int main(int argc,char *argv[]){
	QApplication app(argc,argv);
	QFile file("in.txt");
	if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
		qDebug() << "Open file failed";
		return -1;
	}else{
		while(!file.atEnd()){
			qDebug() << file.readLine();
		}
	}
	QFileInfo info(file);
	qDebug() << info.isDir();
	qDebug() << info.isExacutable();
	qDebug() << info.baseName();
	qDebug() << info.completeBaseName();
	qDebug() << info.suffix();
	qDebug() << info.completeSuffix();
	return app.exec();
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/982539.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号