信号槽机制
信号槽机制是Qt框架的特色, 可以简单描述为,一个对象触发了一个信号,如果某个对象 对这个 信号感兴趣,那么就可以进行连接,当这个对象接收到这个信号后,可以做相应的处理,通常这种处理是交给槽函数来实现的。
class Teacher{
signal:
void hungry();
};
class Student{
slots:
void treat();
};
void Student::treat(){
qDebug() << "该吃饭了!";
}
void MyWidget::classIsOver(){
emit teacher ->hungry();
}
teacher = new Teacher(this);
student = new Student(this);
connect(teacher,&Teacher::hungry,student,&Student::treat);
.pro文件
QT += core gui
greaterThan(QT_MAJOR_VERSION,4): QT += widgets
TARGET=QfFirst
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
- TARGET 指定生成应用程序名:
- HEADERS 指定工程包含的头文件
- FORMS 工程中包含的 ui 设计文件
- SOURCES 工程中包含的源文件
- RESOURCES 工程包含的资源文件
- CONFIG += c++11 # 使用c++11的特性
按钮(QPushButton)
#include <QPushButton>
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);
QAction *addAction(const QString &text);
工具栏
主窗口的工具栏上可以有多个工具条。一般采用一个菜单对应一个工具条的方式,也可根据需要进行工具条的划分 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");
label ->setText("<a href='www.baidu.com'>百度一下</a>");
void setPixmap(const QPixmap &)
QPixmap pixmap
pixmap.load(":资源路");
QLabel *label = new QLabel;
label.setPixmap(pixmap);
void setMoive(QMovie *moive);
QMovie *movie = new QMovie(":/Mario.gif");
movie ->start();
QLabel *label = new QLabel;
label ->setMovie(movie);
QLineEdit
QString text() const;
void setText(const QString &);
void setEchoMode(EchoMode mode);
自定义控件
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<void (QSpinBox:: *)(int)>(&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("<center><h1>Press:(%1,%2)</h1></center>").arg(QString::number(event ->x()),QString::number(event ->y())));
}
void EventLabel::mousePressEvent(QMouseEvent *event){
this ->setText(QString("<center><h1>Press:(%1,%2)</h1></center>").arg(QString::number(event ->x()),QString::number(event ->y())));
}
void EventLabel::mouseReleaseEvent(QMouseEvent *event){
QString msg;
msg.sprintf("<center><h1>Relese:(%d,%d)</h1></center>",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<QKeyEvent *>(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<QKeyEvent *>(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();
}
|