Qt自学笔记

1.QMainWindow 带菜单栏的窗口、QWidget 空窗口、QDialog 对话框(无法伸缩)

2.指定父对象

button.setparent(w);//调用方法指定父对象
button=new QPushButton(this);//构造函数传参

3.添加一个新窗口:新建一个类

在主类中包含其头文件,实例化一个新类对象sth,并且 sth.show();

4.信号与槽——Qt对象之间通信的接口

connect();//信号发出者(按钮等),信号内容,接收者,处理槽函数
//如果是标准信号,去帮助文档找singal,如果找不到,去找这个发出者的父类
  • 自定义信号

    信号必须有关键字signals关键字声明

    信号没有返回值,但可以有参数

    信号只需声明,无需定义mysiganl();

    使用: emit mysignal();

  • 信号可以重载

    利用函数指针区分重载的信号

  • 有参数信号

5.函数指针

如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。

定义方式

int(*p)(int,int);//定义一个指向函数的指针p 前面的int表示返回int类,后面两个int是形参
函数返回值类型 (* 指针变量名) (函数参数列表);

//函数重载时运用
int add(int a,int b)
{
    return a+b;
}
int add()
{
    return 12138;
}
int(*sth)(int,int)=add;
int(*nothing)()=add;

int main()
{
    int(*sth)(int,int)=add;
	int(*nothing)()=add;
    cout<<"有形数:"<<(*sth)(10,20)<<endl;
    cout<<"无形参"<<(*nothing)()<<endl;
    return 1;
}

6.Lambda表达式 匿名函数对象

lambda 表达式是一种匿名函数,即没有函数名的函数;该匿名函数是由数学中的λ演算而来的。通常情况下,lambda函数的语法定义为:

[capture] (parameters) mutable ->return-type {statement} 
//capture:捕捉列表-捕捉上下文中变量以使用
//parameters:参数列表-形参-如果不需要参数传递可以连括号一起省略
//mutable:使捕捉对象可更改取消其const常量性质
//return-type:返回类型
//statement:函数体
int main()
{
    int a=1,b=2,c=3;
    auto lam=[=]() mutable->int
    {
        a++;b++; c++;return a+b+c;
    }
    cout<<a+b+c<<endl;
    cout<<lan();
    return 1;
}

C++11增加的新特性,项目文件:CONFIG+=C++11 Qt中配合信号使用非常方便

    connect(b2,&QPushButton::released,
            // =:将外部所有局部变量、类中所有成员以值传递方式传入
            //mutable:可变的 允许变量被修改
            //this:类中所有成员以值传递方式传入
            //&:引用符号
            [=]() mutable
            {
                b2->setText("已经修改");
                qDebug()<<a;
                a=0;
            }
            );

7.坐标系统——以父部件左上角为原点

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    this->resize(400,300);
    this->move(100,100);

    QPushButton *b1=new QPushButton(this);//以MyWidget为父对象

    b1->setText("whatever");
    b1->move(100,100);//以MyWidget左上角为原点
    b1->resize(100,100);

    QPushButton *b2=new QPushButton(b1);//以按钮b1为父对象
    b2->setText("sth");
    b2->move(10,10);
}

8.垃圾清理 对象树自动释放

9.菜单栏 、状态栏、工具栏、核心控件、浮动窗口

//使用菜单栏等先包含其头文件!!!	

//菜单栏
QMenuBar* mbar=menuBar();
//添加菜单内容
QMenu *pFile=mbar->addMenu("文件");
//添加菜单项,添加动作
QAction *pNew=pFile->addAction("新建");
//新建分隔符
pFile->addSeparator();
//新建工具栏
QToolBar *toolbar=addToolBar("toolbar");
//工具栏添加快捷键
toolbar->addAction(pNew);
QAction *pOpen=pFile->addAction("打开");
QPushButton* b1=new QPushButton(this);
toolbar->addWidget(b1);//添加小部件
//状态栏
QStatusBar *sbar=statusBar();
QLabel *label=new QLabel(this);
label->setText("Normal text file");
sbar->addWidget(label);
//状态栏addwidget 从左往右添加
sbar->addWidget(new QLabel("2",this));
sbar->addPermanentWidget(new QLabel("从右往左",this));
//核心控件
QTextEdit *tedit=new QTextEdit(this);//文本编辑
setCentralWidget(tedit);//设置中心部件
//浮动窗口
QDockWidget *dock=new QDockWidget(this);
addDockWidget(Qt::RightDockWidgetArea,dock);
QTextEdit *t1=new QTextEdit(this);
dock->setWidget(t1);//把文本编辑放入浮动窗口

10.模态和非模态对话框

//模态:阻塞,不能操作主对话框
//非模态:可以同时操作
QMenu *menu=mbar->addMenu("对话框");//添加菜单
QAction *yes=menu->addAction("模态对话框");//添加菜单项
QAction *no=menu->addAction("非模态对话框");//添加菜单项

    connect(yes,&QAction::triggered,
            []()
    {
        QDialog dlg;
        dlg.exec();//阻塞
        qDebug()<<"模态对话框";
    });

    connect(no,&QAction::triggered,
            [=]()
    {

        dlg1.show();//私有成员 QDialog dlg1;
        qDebug()<<"非模态对话框";
    });

你可能感兴趣的:(Qt)