Qt基础内容

基础框架

#include <QApplication>
//QApplication应用程序类
//Qt头文件没有.h
//头文件和类名一样
int main(int argc, char *argv[])
{
    //有且只有一个应用程序类的对象
    QApplication a(argc, argv);
    
    //MyWidget继承于QWidget,QWidget是一个窗口基类
    //所以MyWidget也是窗口类
    //w就是一个窗口
    MyWidget w;
    //窗口创建默认是隐藏,需要人为显示
    w.show();
    //让程序一直执行,等待用户操作
    //等待事件的发生
    return a.exec();
}

项目文件(qmake)

#模块
QT       += core gui
#高于4版本,添加QT += widgets,为了兼容Qt4
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
DEFINES += QT_DEPRECATED_WARNINGS
#应用程序的名字
TARGET = mike
#指定makefile的类型,app
TEMPLATE = app
#源文件 .cpp文件
SOURCES += \
    main.cpp \
    mywidget.cpp
#头文件 .h文件
HEADERS += \
    mywidget.h

父对象

如果不指定父对象,对象和对象(窗口和窗口)没有关系,独立

a指定b为它的父对象,a放在b上面

指定父对象,有2种方式:

  1. setParent
  2. 通过构造函数传参

指定父对象,只需要父对象显示,上面的子对象自动显示

信号和槽函数

connect(&b1,&QPushButton::pressed,this,&Widget::close);
/*&b1:信号发出者,指针类型
 * &QPushButton::pressed:处理的信号,&发送者的类名::信号名字
 * this:信号接受者
 * &MainWidget::close:槽函数,信号处理函数,&接收的类名::槽函数名字
*/
  • 槽函数:可以是任意类型的函数,包括成员函数、普通全局函数、静态函数
    • 需要和信号一致(参数、返回值)
    • 由于信号没有返回值,所以槽函数一定没有返回值

自定义信号

class subWidget : public QWidget
{
    Q_OBJECT
public:
    explicit subWidget(QWidget *parent = nullptr);
    void sendSignal(){emit mySignal();}
signals:
    void mySignal();
    /* 信号必须有signals关键字来声明
     * 信号没有返回值,但可以有参数
     * 信号就是函数的声明,只需声明,无需定义
     * 使用:emit mySignal(),信号可以重载
    */
private:
    QPushButton b;
};

重载信号

​ 当同个信号需要不同版本的定义的时候:不同的参数值。因此需要将信号进行重载,在利用时需要利用函数指针处理。

void (subWidget::*funSignal)() = &subWidget::mySignal;
void (subWidget::*testSignal)(int,QString) = &subWidget::mySignal;
connect(&subW,testSignal,this,&Widget::mySlot2);

​ 或者利用Qt4的语法:SIGNAL()和SLOT(),不建议使用

connect(&subW,SIGNAL(mySignal()),this,&Widget::mySlot);

​ 但是该方法利用的是c语言的宏定义,将函数名字转换成字符串,不进行错误检查

lambda表达式和qt

​ lambda表达式实质上是函数对象,也可以将其理解为未命名内联函数。它具有一个返回类型、一个参数列表和一个函数体。

  • 语法规则:
[/*捕获列表*/](/*传入参数*/)
{
    /*函数体*/
}
/*[],方括号里存放的是捕获列表,能够捕获lambda定义处作用域内的局部变量、类成员变量
 *=:把外部所有变量、类中所有成员以值传递方式
 *this:类中所有成员以值传递方式
 *&:把外部所有局部变量引用符号
 *也可以放进外部变量名,直接捕获
 */
/*(),小括号里可以像普通函数一样传入参数*/
/* 函数体与普通函数实现相同 */

connect(pb2,&QPushButton::pressed,
        [=](){
            b1.setText("123");//b1是外部变量
        });

坐标系统

  • 对于父窗口,坐标系统相对于屏幕
  • 原点:相对于屏幕左上角(相对于父对象),不包括边框
  • x:往右递增
  • y:往下递增

Qt内存回收机制

  • 指定父对象后,子对象如果是动态分配空间new,不需要手动释放delete,系统会自动释放。主要实现机制是,QT内部利用对象树来释放资源

窗口基础框架

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //菜单栏
    QMenuBar *mBar = menuBar();
    //添加菜单
    QMenu *pFile = mBar->addMenu("文件");
    //添加菜单项,添加动作
    QAction *pNew = pFile->addAction("新建");
    connect(pNew,&QAction::triggered,
            [=]()
            {
                qDebug()<<"新建";
            }
            );
    //工具栏,菜单项的快捷方式
    QToolBar *toolBar = addToolBar("toolBar");

    //工具栏添加快捷键
    toolBar->addAction(pNew);

    //状态栏
    QStatusBar *sBar = statusBar();
    QLabel *label = new QLabel(this);
    label->setText("Normal text file");
    //addWidget 从左往右添加
    sBar->addWidget(label);

    //addPermanentWidge 从右往左添加
    sBar->addPermanentWidget(new QLabel("3",this));

    //核心控件
    QTextEdit *textEdit = new QTextEdit(this);
    setCentralWidget(textEdit);

    //浮动窗口
    QDockWidget *dock = new QDockWidget(this);
    addDockWidget(Qt::RightDockWidgetArea,dock);

    //模态和非模态对话框
    QMenu *pDia = mBar->addMenu("对话框");
    QAction *pmotai = pDia->addAction("模态对话框");
    connect(pmotai,&QAction::triggered,
            [=]()
            {
                QDialog tmp;
                tmp.exec();
            }
            );
    QAction *pfeimotai = pDia->addAction("非模态对话框");
    connect(pfeimotai,&QAction::triggered,
            [=]()
            {
                QDialog tmp;
                tmp.show();
            }
            );

    //标准对话框和文件对话框


}

Qt常用函数

  • include

    . qDebug():类似于cout,qDebug()<<… //自动带换行,无需endl

  • include

  1. str.toUtf8().data():将Qstring转化为utf8编码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值