Qt学习笔记

QT Creator
    一门图形界面开发框架------专注于界面的开发
    例如:
        手机界面
        电脑桌面    
        其他界面
        .....
学习方法:
    (1)英语阅读能力要好一点
        QT将一些类和方法进行了封装,一般是采用英语(方法名、属性、子类、父类等等)进行介绍
    (2)学习QT reator
        1)多查帮助
        2)从类的架构要清晰(有哪些类)---了解类(父类、子类)里的有哪些方法(有什么作用等等)----了解方法的返回值、参数等等

    GUI,graphical  user  interface,图形用户接口,是指将用户在计算机中相关的操作以图形方式进行体现,即用户只需要操作图形界面,就能实现相关的功能

    例如:
        用户双击电脑界面上的文件夹图标,就能实现打开文件夹的功能
        如果无GUI,实现打开文件夹的功能?纯代码方式实现

一、QT的基本介绍
1、发展
    1998年,奇趣科技发展有限公司,研究界面的开发,QT Creator发展出来,功能不怎么完善、跨平台能力比较弱等等
    2008年,被诺基亚公司收购,手机开发,使用debian系统实现的手机界面,实现起来比较困难,在一段时间内用QT。
    2012年,芬兰的digia科技发展公司收购,功能就逐渐被完善、跨平台能力也是比较强(桌面应用、移动应用等等)
2、特点
    跨平台能力比较强
        windows、linux、macos、BSD等等
    封装机制比较丰富(具有完善的面向对象机制)
        QT对类进行了封装,界面类、窗口类、图形类(2D、3D等)、网络通信类、数据库类等等
    简单易学易上手
    ....

3、应用
    汽车的仪表盘
    剪辑软件
    股票的系统
    游戏:植物大战僵尸、扫雷、字牌、极品飞车等等
    记事本
    WPS
    google地图等等
    .........
    总结:有界面都可以用QT实现

二、第一个QT 应用程序
MaintenanceTool.exe:用于更新或者卸载相关的组件

窗口类:
    QMainwindow
    QDialog
    QWidget

mydialog.ui  //界面文件

群里:图片


三、信号与槽机制(重点,但不是难点)
    机制:
        是一种两个对象之间的通信的机制
    例如:
        鼠标双击-------文件夹图标---------打开文件夹功能
        通信的过程:
            用户对象
            文件夹图标对象
            鼠标双击,相当于告诉文件夹(即给文件夹一个信号),我现在想要打开你
            文件收到信号,就执行打开文件夹的功能

    信号:在QT中信号用函数来进行体现
    槽:在QT中槽也是用函数来进行体现
    实现两个对象之间的通信:
        提前将两个对象进行绑定(类似于成为你的QQ好友)
    QT中提供了绑定的函数(方法):
        函数原型:
            connect(对象1,对象1发出的信号,对象2,处理对象1发出的信号);//来自于QObject
            connect(对象1,SIGNAL(信号),对象2,SLOT(槽));
        对象1:是一个类的实例化,信号的发出者
        对象2:是一个类的实例化,信号的接收者
        对象1发出的信号:信号,实质上是一个函数,信号是对象1中的函数,信号使用SIGNAL函数包含
        处理对象1发出的信号:槽,实质上也是一个函数,槽是对象2中的函数,槽使用SLOT函数包含
        QObject中的原型:
    QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
     QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)
     QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
     QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
     QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection)
        注:
            (1)connect函数不仅可以绑定一个信号和槽,也能绑定两个信号
            (2)多个信号可以绑定同一个槽函数,先绑定先执行,后绑定后执行
            (3)一个信号可以绑定多个槽函数
            (4)绑定时SIGNAL、SLOT中信号和槽只需要写参数类型,不需要形参名        
例子:
    车上的司机,看见红灯亮了之后,车就停下,人过马路
    对象1:车
    信号:车看见红灯亮了,停下
    对象2:人
    槽:人就可以过马路
    绑定:使用connect函数绑定车和人两个对象

1、自定义信号与槽(需要用户手动的进行触发)
信号:在类中需要放置在关键字signals下
    例如:
        signals:
            信号1;
            信号2;
            ......
    注意事项:
        (1)信号只需要声明,不需要实现
        (2)信号的返回值类型是void类型
        (3)信号也是可以发生重载
        (4)信号的参数个数必须大于等于槽函数的参数个数
        
槽:在类中需要放置在关键字slots下
    例如:
        slots:
            槽1;
            槽2;
            ....
    注:
        (1)slots前可以加上修饰符:public、protected、private(与C++中修饰符的作用一致)
        (2)槽函数既需要声明,也需要实现
        (3)槽函数的返回值类型一般也是设置为void类型
        (4)当槽函数的参数与信号的参数一致时,需要满足槽函数的参数类型和信号的参数类型保持一致
信号的触发:
    使用emit关键字对信号进行触发
    格式:
        emit    信号;//将信号给发送出去

练习1:
    元旦节快到了,老师给大家发送红包,老师给张三发送红包,老师先将红包给李四,让李四把红包给张三,张三收到了红包之后对老师表示感谢
    对象1:老师
    对象2:李四
    对象3:张三

练习2:
    小张培训完了之后,去干开发的工作,老板给张三100块钱,让张三去给老板买水,张三收到了100块之后,由于人情世故,张三可以选择不要100块,也可以选择要100块去给老板买水

2、自动绑定的信号与槽
    用户只需要选择相应的信号--------执行转到槽操作---------QT自动完成绑定的过程
以按钮为例:
按钮中的信号:
    clicked()//点击按钮时出发该信号
    clicked(bool)
    pressed()//按下按钮时出发该信号
    released()//按下按钮并释放按钮时出发该信号
    toggled(bool)//按钮的状态取反时出发该信号

    练习:
        (1)使用自动绑定信号与槽(用按钮),实现奇偶数的交替打印
        (2)使用按钮点击发送数据,点击按钮时将数据发送给Teacher类,Teacher类再将数据发送给Student类,实现数据的传递
        (3)现有四个类,分别是按钮类、People1、People2、People3
            用户点击按钮类,将发射整形数据给People1和People3类
            如果整形数据是1,则给People1类,如果整形数据是2,则给People3类
            其中如果是整形数据1,则发送给People1类的时候,也需要让People2告诉People3不用进行接收;如果是整形数据2,则需要让People2告诉People3进行接收并输出收到的数据

    QT中解绑两个对象的绑定:
        函数原型:
            bool disconnect(对象1,对象1发出的信号,对象2,对对象1发出的信号进行处理);//解绑对象1和对象2绑定的信号和槽
        解绑1:

            disconnect(对象1,对象1的信号,对象2,对象2的槽);
            解绑指定的两个对象中的指定的信号和槽
        解绑2:
            disconnect(对象1,对象1的信号,对象2,nullptr);
            解绑对象1中的信号和对象2中的所有(任何)槽函数

        解绑3:
            disconnect(对象1,对象1的信号,nullptr,nullptr);
            解绑对象1中的信号和其它所有对象的槽函数的绑定

        解绑4:
            disconnect(对象1,nullptr,nullptr,nullptr);
            解绑指定的对象1中的任何信号和其它任何对象的槽的绑定

四、界面
    QT提供了三个界面:QMainWindow、QWidget、QDialog
1、QMainWindow
    称为“主界面”,该界面一般是作为顶层窗口使用,该界面包含了菜单栏、工具栏、状态栏以及工作区等信息
2、QWidget
    所有可视化窗口的父类,QMainWindow、QDialog、QPushButton等等的父类都是QWidget,一般QWidget既可以作为顶层窗口使用,也可以嵌入到其它窗口中
3、QDialog
    基于简单对话框的窗口,不具备菜单栏、工具栏、状态栏以及工作区等功能,一般是作为顶层窗口使用
    创建QDialog界面:
        (1)创建项目时就已经创建了一个界面
        (2)自己创建界面
            选择工程文件夹右击----添加新文件----Qt-----QT设计师界面类----Dialog Without Buttons
    方法:
        show();//将界面显示出来,以非模态形式进行显示
        hide();//将界面进行隐藏
        close(); //将界面进行关闭
        void resize(const QSize &size);  //后期可以再对界面的大小进行放缩
        void resize(int w, int h);//设置界面的大小
        void setFixedSize(const QSize &size);  //设置界面的固定大小,后期不允许更改界面的大小
        void setFixedSize(int w, int h);//设置界面的大小
        void setWindowTitle(const QString &obj);  //设置窗口的标题,QString QT中提供的强大关于字符串处理的类
        void setWindowIcon(const QIcon &icon);//设置界面的LOGO
        void setSizeGripEnabled(bool);  //设置窗口右下脚是否有斜三角网格图标
        bool isSizeGripEnabled() const  ;//可以返回右下角是否有斜三角图标,如果有返回true,如果没有,返回false
        void setResult(int i)  ;  //设置界面的返回值
        int result() const  ;  //获取界面的返回值
         void setModal(bool modal)  ;//设置对话框的模式,结合show方法一起使用
        void exec(); //设置对话框以模态形式显示
         QString windowTitle() const //获取窗口的标题
    UI界面属性:
        objectName:对象名
        enabled:设置是否启用界面的操作
        geometry:设置界面的几何特性
信号:
 void windowIconChanged(const QIcon &icon)//当LOGO变化时,触发该信号
 void windowTitleChanged(const QString &title)//当标题变化时,触发该信号
对话框的模式分类:
    模态对话框和非模态对话框
    模态对话框:也称为阻塞对话框,是指当前界面是以模态形式显示,如果当前界面没有被关闭,那么后序界面就不能进行相关的操作,模态一般采用exec()方法进行显示
    非模态对话框:也称为非阻塞对话框,是指当前界面是以非模态形式显示,如果当前界面没有被关闭,那么后序界面就能进行相关的操作,一般使用show()方法进行显示

//练习:
    创建两个界面,两个界面中各有一个按钮,点击其中一个界面中的按钮,能实现打开另外一个界面并且关闭当前界面(实现界面的切换)

五、常用的基本控件
1、按钮类:QPushButton/QRadioButton
第一种:源码实现(实例化按钮类)
 QPushButton(const QIcon &icon, const QString &text, QWidget *parent = nullptr) //参数1传递图片,参数2传递文本,参数3指定父对象
 QPushButton(const QString &text, QWidget *parent = nullptr)//参数1传递文本,参数2指定父对象
 QPushButton(QWidget *parent = nullptr)  //指定父对象
    //设置父对象
    btn->setParent(this);
    //设置按钮显示的文本
    btn->setText("登录");
    //设置按钮的大小
    btn->resize(QSize(50,20));
    //移动按钮
    btn->move(100,0);
    //设置按钮的几何属性
    btn->setGeometry(100,100,100,30);
    //设置是否禁用按钮
    btn->setEnabled(true);//false:禁用   true:启用(默认)
    //设置按钮中的图标
    btn->setIcon(QIcon(":/img/photo.jpg"));
    //设置按钮背景是否隐藏
    btn->setFlat(false);//true:隐藏  false:不隐藏(默认)
    //设置鼠标定位到按钮上提示的文本
    btn->setToolTip("这是按钮");
    //设置按钮是否具有选中使能
    btn->setCheckable(true);//true:使能(默认)  false:失能
    btn->setChecked(true);//true:选中(默认)   false:未选中
    //设置按钮是否具备快捷键
    btn->setShortcutEnabled(0,true);
    //设置按钮的快捷键
    btn->setShortcut(QKeySequence::Backspace);
    //获取快捷键
    QKeySequence key=btn->shortcut();
    //设置是否是回车键作为快捷键
    btn->setAutoDefault(true);//true:回车键有效(默认)  false:无效
    //获取按钮的文本
    QString text=btn->text();//获取按钮中的文本
    //判断背景是否是隐藏
    bool flag= btn->isFlat();
    //设置按钮的字体
    btn->setFont(QFont("宋体",30));
    //设置光标
    btn->setCursor(Qt::PointingHandCursor);
    connect(this->btn,SIGNAL(clicked()),this,SLOT(print()));
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(print()));
信号:
 void clicked(bool checked = false)
 void pressed()
 void released()
 void toggled(bool checked)
第二种:ui界面实现(拖控件放到ui界面)
text:设置按钮的文本
icon:设置图片
iconsize:设置图片的大小
shortcut:设置快捷键
checkable:设置是否选中使能
chekced:设置是否选中
autoDefaoult:设置回车键是否有效
defalut:设置默认按钮
flat:设置按钮的背景是否隐藏

第三种:采用继承QPushbutton方式
class MyButton : public QPushButton
{
    Q_OBJECT
public:
    explicit MyButton(QWidget *parent = nullptr);

signals:
    void send_Data(int a);

};
练习:
    设计一个计算器,计算0-9的加减乘除运算,并将结果进行输出(必须纯代码实现)

2、标签类:QLabel
    用于提示作用,也可以显示视频、图像、文本等等
源码:
 QLabel(const QString &text, QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())
 QLabel(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())    
    //设置标签的文本
    this->label->setText("鲜肉:");
    //设置标签的大小
    this->label->resize(150,150);
    //移动标签的位置
    this->label->move(100,0);
    //设置标签的字体
    //this->label->setFont(QFont("黑体",15));
    //设置标签显示的数字(浮点型和整型)
    this->label->setNum(10.5);
    //获取标签显示的文本
    QString text=this->label->text();
    qDebug()<<"获取的数据:"<<text<<endl;
    //设置标签中的内容的缩进
//    this->label->setIndent(5);
    //设置标签中的文本对齐方式
    //this->label->setAlignment(Qt::AlignLeft);//文本对齐方式为右对齐
    //获取文本的对齐方式
    Qt::Alignment flag=this->label->alignment();
    //设置标签换行
    this->label->setText("hfohfsofhi ofhsiofhosif");//低版本
    this->label->setWordWrap(true);//true:换行  false:不换行
    //设置标签显示的图片
//    this->label->setPixmap(QPixmap(":/img/photo1.jpg"));
    //设置图片自适应标签的大小
    this->label->setScaledContents(true);//true:自适应  false:不适应
    //设置文本格式
    this->label->setTextFormat(Qt::AutoText);
    //设置边距
    this->label->setMargin(1);//上下左右边距
    //显示gif(动画)图
    QMovie *moive=new QMovie(":/img/photo2.gif");
    this->label->setMovie(moive);
    moive->setSpeed(600);//加速播放
    moive->start();//启动播放动画
    //停止,暂停
//    moive->stop();
//    moive->setPaused(true);


练习:使用gif模拟视频播放器
    能控制开始播放
    能控制停止播放
    能调节播放的速度
    选择gif图进行播放
    .....
UI:
    frameShape:设置标签的边框样式
    frameShadow:设置边框阴影
    lineWidth:设置边框的宽度
    midLineWidth:设置线的宽度
    text:设置文本
    textFormat:设置文本格式
    pixMap:设置标签中的图像
    sclaedContents:设置自适应
    alignment:设置对齐方式
    wordWrap:设置是否换行
    margin:设置文本内容据边框的边距
    indent:设置缩进
    openExternLinks:放置外部链接
继承:

3、行编辑(输入)框:QLineEdit
代码:
 QLineEdit(QWidget *parent = nullptr)
 QLineEdit(const QString &contents, QWidget *parent = nullptr)//第一个参数设置显示的文本
    //设置行编辑框的大小
    this->lineEdit->resize(100,40);
    //设置行编辑框的位置
    this->lineEdit->move(0,0);
    //设置行编辑框背景提示的文本
    this->lineEdit->setPlaceholderText("请输入账号");
    //设置行编辑框最大输入的字符数
    this->lineEdit->setMaxLength(5);
    //设置行编辑框的文本可见模式
    this->lineEdit->setEchoMode(QLineEdit::Normal);
    //获取文本的可见模式
    QLineEdit::EchoMode mode=this->lineEdit->echoMode();
    if(mode==QLineEdit::Normal)
    {
        qDebug()<<"正常模式"<<endl;
    }
    //清空行编辑框
    this->lineEdit->clear();
    //设置文本提示的内容
    //this->lineEdit->setText("请输入密码");
    //获取行编辑框里的内容
    QString text=this->lineEdit->text();
    //设置行编辑框是否是只读
    //this->lineEdit->setReadOnly(true);//true:只读  false:不只读
    //获取行编辑框最大能输入的字符数
    int length=this->lineEdit->maxLength();
    connect(this->lineEdit,SIGNAL(cursorPositionChanged(int,int)),this,SLOT(receive_Cursor_Change(int,int)));
    connect(this->lineEdit,SIGNAL(textChanged(QString)),this,SLOT(receive_Text_Changed(QString)));
QLineEdit::Normal0Display characters as they are entered. This is the default.  //正常
QLineEdit::NoEcho1Do not display anything. This may be appropriate for passwords where even the length of the password should be kept secret. //输入时不可见
QLineEdit::Password2Display platform-dependent password mask characters instead of the characters actually entered.//输入时密码模式
QLineEdit::PasswordEchoOnEdit3Display characters as they are entered while editing otherwise display characters as with Password.//输入时正常,输入完不可见

信号:
void cursorPositionChanged(int oldPos, int newPos)  //当光标位置,改变时触发该信号,将光标新的位置和就的位置进行返回
 void editingFinished()  //编辑完成时触发该信号
 void inputRejected()  //输入被拒绝时触发信号
 void returnPressed()  //返回按钮按下时信号
 void selectionChanged() //文本选择变化时触发该信号
 void textChanged(const QString &text) //文本变化时触发该信号
 void textEdited(const QString &text) //文本编辑时触发该信号
UI:
参考:
    练习
练习:
    模拟QQ注册与登录界面
    实现功能:
        (1)实现注册/登录界面,登陆成功之后进入使用计算器界面(实现界面的跳转)
        (2)用户能进行注册账户(支持注册多个账户)
        (3)用户能对输入的密码进行隐藏或显示
        .....
4、组合框:QComboBox
    用于存放一些列表项
源码:
 QComboBox(QWidget *parent = nullptr)
 void addItem(const QString &text, const QVariant &userData = QVariant()) //向组合框中添加列表项
 void addItem(const QIcon &icon, const QString &text, const QVariant &userData = QVariant())
 void addItems(const QStringList &texts)
void insertItem(int index, const QString &text, const QVariant &userData = QVariant())
 void insertItem(int index, const QIcon &icon, const QString &text, const QVariant &userData = QVariant())
 void insertItems(int index, const QStringList &list)
 void removeItem(int index)//移除
 void setItemText(int index, const QString &text)//将列表项更新为新的列表项
    //添加列表项
    this->comboBox->addItem("星期一      2.5元");
    this->comboBox->addItem("星期二      3.0元");
    this->comboBox->addItem(QIcon(":/img/photo1.jpg"),"星期三      3.0元");
    QStringList list;
    list<<"星期四     3.1元"<<"星期五         3.2元";
    this->comboBox->addItems(list);
    qDebug()<<"组合框中的列表项数目:"<<this->comboBox->count()<<endl;
    qDebug()<<"返回当前列表项的下标:"<<this->comboBox->currentIndex()<<endl;
    qDebug()<<"返回当前列表项:"<<this->comboBox->currentText()<<endl;
    int  index=this->comboBox->findText("星期五         3.2元");//在组合框中查询是否有指定列表项,如果有,返回下标,如果没有返回-1
    qDebug()<< "星期五         3.2元对应的下标:"<<index<<endl;
    // QString itemText(int index) const//通过下标找到指定的列表项
    QString text=this->comboBox->itemText(index);
    qDebug()<<"下标为:index对应的列表项:"<<text<<endl;
    QIcon icon=this->comboBox->itemIcon(2);
    QStringList list1;
    list1<<"昨天"<<"今天"<<"明天"<<"后天";
    this->comboBox->insertItems(1,list1);//在指定位置插入列表项
    this->comboBox->removeItem(index);//移除指定的列表项
    this->comboBox->setItemText(index,"helloworld");

    connect(this->comboBox,SIGNAL(activated(QString)),this,SLOT(rece1_Text(QString)));
    connect(this->comboBox,SIGNAL(highlighted(int)),this,SLOT(rece2_Text_Index(int)));


信号:
 void activated(int index) //当列表项变化时触发该信号
 void activated(const QString &text)
 void currentIndexChanged(int index) //当前列表项下标变化时触发该信号
 void currentIndexChanged(const QString &text)
 void currentTextChanged(const QString &text)//当前列表项变化时触发该信号
 void editTextChanged(const QString &text)
 void highlighted(int index) //列表项高亮时触发该信号
 void highlighted(const QString &text)


//用组合框模拟账户的存储与取出
作业:
    使用组合框模拟购物车
    (1)用户可以添加物品到购物车中
    (2)用户可以移除购物车中指定的物品
    (3)用户可以清空并结算购物车中商品总价
    (4)同一个商品用户可以购买多个
UI:
    editable:设置组框当前列表项是否可编辑
    currentText:获取组合框中的当前显示的列表项
    currrenIdex:获取当前列表项的下标
    maxVisibleItems:列表项可移动的最大数目
    maxCount:设置组合框中最多能容纳的列表项的数目
    insertPolicy:设置插入列表项的策略
    sizeAdjustPolicy:设置组合框中列表项适应组合框
    minimumContentsLength:最小的列表项的长度
    iconsize:设置图片的大小
    placeholderText:背景提示的文本
    frame:边框
    modelColumn:列表项

5、自旋框:QSpinBox
自旋框:
    单精度自旋框:QSpinBox
     QSpinBox(QWidget *parent = nullptr)
    //单精度自旋框

    //设置自旋框的大小
    this->spinBox->resize(100,30);
    //设置自旋框的位置
    this->doubleSpinBox->move(100,0);
    //设置自旋框调节的最大值
    this->spinBox->setMaximum(10);
    //设置自旋框调节的最小值
    this->spinBox->setMinimum(0);
    //设置自旋框调节范围
    this->spinBox->setRange(0,10);
    //设置自旋框显示的内容的前缀
    this->spinBox->setPrefix("白菜:");
    //设置自旋框显示的内容的后缀
    this->spinBox->setSuffix("元");
    //获取自旋框的内容
    QString text=this->spinBox->text();
    qDebug()<<"内容:"<<text<<endl;
    //获取自旋框的数值
    int data=this->spinBox->value();
    qDebug()<<"数值:"<<data<<endl;
    //设置自旋框当前显示的数值
    this->spinBox->setValue(5);
    //获取前缀
    QString prefix=this->spinBox->prefix();
    //获取后缀
    QString suffix=this->spinBox->suffix();
    //设置自旋框的步进值
    this->spinBox->setSingleStep(2);


    //双精度自旋框
    this->doubleSpinBox->setDecimals(4);//设置双精度自旋框的精度(小数点的位数)
    this->doubleSpinBox->setSingleStep(0.0001);
    this->doubleSpinBox->move(150,0);
    //其他方法参考单精度自旋框


    connect(this->spinBox,SIGNAL(valueChanged(int)),this,SLOT(receive_Value(int)));

信号:
    void textChanged(const QString &text)//当自旋框的文本变化时触发该信号,将文本内容发送出来
     void valueChanged(int i)//当自旋框的数值变化时,触发该信号,将数值发送出来
    双精度自旋框:QDoubleSpinBox
UI:
    maxiMum:最大值
    miniMum:最小值
    range:范围
    prefix:前缀
    suffix:后缀
    singleStep:步进值
    .....
    
6、复选框:QCheckBox
 QCheckBox(const QString &text, QWidget *parent = nullptr)
 QCheckBox(QWidget *parent = nullptr)
 Qt::CheckState checkState() const //获取复选框的状态
 bool isTristate() const  //获取复选框是否设置了三种状态
 void setCheckState(Qt::CheckState state)//设置复选框的状态
 void setTristate(bool y = true) //设置复选框是否有三种状态
Qt::Unchecked0The item is unchecked.  //未选中状态
Qt::PartiallyChecked1The item is partially checked. Items in hierarchical models may be partially checked if some, but not all, of their children are checked.    //半选中状态
Qt::Checked2The item is checked.   //全选中状态
    //设置大小
    this->checkBox->resize(100,40);
    //设置位置
    this->checkBox->move(0,0);
    //设置复选框的文本提示
    this->checkBox->setText("是否同意该协议");
    //设置复选框具有三种状态
    this->checkBox->setTristate(true);//true:三种  false:两种
    //设置复选框的状态
    this->checkBox->setCheckState(Qt::PartiallyChecked);
    //获取复选框的状态
    Qt::CheckState  state=this->checkBox->checkState();
    if(state==Qt::PartiallyChecked)
    {
        qDebug()<<"半选中状态"<<endl;
    }
    connect(this->checkBox,SIGNAL(stateChanged(int)),this,SLOT(receive_State(int)));

信号:
 void stateChanged(int state) //当复选框状态变化时,触发该信号,将该状态发送出去

UI:
    text:设置文本
    icon:设置图片
    iconsize:图片大小
    shortcut:快捷键
    ....

7、分组框:QGroupBox
    对基本的控件进行分组设计
 QGroupBox(const QString &title, QWidget *parent = nullptr)
 QGroupBox(QWidget *parent = nullptr)
 virtual ~QGroupBox()
 Qt::Alignment alignment() const
 bool isCheckable() const
 bool isChecked() const
 bool isFlat() const
 void setAlignment(int alignment)
 void setCheckable(bool checkable)
 void setFlat(bool flat)
 void setTitle(const QString &title)
 QString title() const
    //获取标题对齐方式
    Qt::Alignment align=this->groupBox->alignment();
    //设置分组框的大小
    this->groupBox->resize(180,100);
    //设置标题的对齐方式
    this->groupBox->setAlignment(Qt::AlignRight);//左对齐
    //设置标题
    this->groupBox->setTitle("按钮组");
    //获取标题
    QString title=this->groupBox->title();
    //设置分组框的复选框
    this->groupBox->setCheckable(true);//分组框标题前有复选框
    //设置选中该分组框
    this->groupBox->setChecked(true);
    //设置分组框边框是否隐藏
    this->groupBox->setFlat(true);

信号:
 void clicked(bool checked = false)
 void toggled(bool on)
UI:
    titile:设置标题
    alignment:设置对齐方式
    flat:设置边框是否隐藏
    checkable:设置是否具有复选框
    checked:设置复选框是否选中


8、滑动条:QSlider
 QSlider(Qt::Orientation orientation, QWidget *parent = nullptr)
 QSlider(QWidget *parent = nullptr)
 virtual ~QSlider()
 void setTickInterval(int ti)
 void setTickPosition(QSlider::TickPosition position)
QSlider::NoTicks0Do not draw any tick marks.
QSlider::TicksBothSides3Draw tick marks on both sides of the groove.
QSlider::TicksAbove1Draw tick marks above the (horizontal) slider
QSlider::TicksBelow2Draw tick marks below the (horizontal) slider
QSlider::TicksLeftTicksAboveDraw tick marks to the left of the (vertical) slider
QSlider::TicksRightTicksBelowDraw tick marks to the right of the (vertical) slider
 int tickInterval() const
 QSlider::TickPosition tickPosition() const

信号:
 void actionTriggered(int action)
 void rangeChanged(int min, int max)
 void sliderMoved(int value)
 void sliderPressed()
 void sliderReleased()
 void valueChanged(int value)
    //设置刻度值
    this->slider->setTickInterval(10);
    //设置滑动条的刻度的位置
    this->slider->setTickPosition(QSlider::TicksBelow);
    //获取刻度值
    this->slider->tickInterval();
    //获取位置
    this->slider->tickPosition();
    //设置滑动条的当前值
    this->slider->setValue(5);
    //设置滑动条的范围
    this->slider->setRange(0,10);
    //信号
    connect(this->slider,SIGNAL(sliderMoved(int)),this,SLOT(value_Changed(int)));

9、进度条:QProgressBar
 void reset()  //复位到默认进度条的默认值
 void setMaximum(int maximum)
 void setMinimum(int minimum)
 void setOrientation(Qt::Orientation)
 void setRange(int minimum, int maximum)
 void setValue(int value)

 void valueChanged(int value)//进度条值改变时也会触发该信号
    //复位
    this->progressBar->reset();
    //设置最大值
    this->progressBar->setMaximum(100);
    //设置最小值
    this->progressBar->setMinimum(0);
    //设置当前值
    this->progressBar->setValue(50);

    //设置进度条的范围
    this->progressBar->setRange(0,100);
    //设置进度条的摆放形式
    this->progressBar->setOrientation(Qt::Horizontal);
    //设置进度条的加载方向
    this->progressBar->setInvertedAppearance(true);
    //参考帮助
10、QTabWidget
参考帮助
11、QTreeWidget
参考帮助
.................

六、主界面:QMainWindow
    包含了菜单栏、工具栏、状态栏以及工作区等功能
    菜单栏:使用QMenuBar类管理,管理菜单栏中的菜单或者执行动作
        执行动作:QAction类管理
    工具栏:使用QToolBar类管理
    状态栏:使用QStatusBar类管理
    工作区:使用QDockWidget类管理
    菜单项:QMenu类管理菜单项
    QAction *addAction(const QString &text)
 QAction *addAction(const QIcon &icon, const QString &text)
 QAction *addAction(const QString &text, const QObject *receiver, const char *member, const QKeySequence &shortcut = 0)
 QAction *addAction(const QIcon &icon, const QString &text, const QObject *receiver, const char *member, const QKeySequence &shortcut = 0)
 QAction *addAction(const QString &text, Functor functor, const QKeySequence &shortcut = 0)
 QAction *addAction(const QString &text, const QObject *context, Functor functor, const QKeySequence &shortcut = 0)
 QAction *addAction(const QIcon &icon, const QString &text, Functor functor, const QKeySequence &shortcut = 0)
 QAction *addAction(const QIcon &icon, const QString &text, const QObject *context, Functor functor, const QKeySequence &shortcut = 0)
 QAction *addMenu(QMenu *menu)
 QMenu *addMenu(const QString &title)
 QMenu *addMenu(const QIcon &icon, const QString &title)
QMainWindow:
void addToolBar(Qt::ToolBarArea area, QToolBar *toolbar) //添加工具栏
 void addToolBar(QToolBar *toolbar)
 QToolBar *addToolBar(const QString &title)

 void addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget) //添加工作区
 void addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget, Qt::Orientation orientation)

1、菜单栏:QMenuBar
QAction *addAction(const QString &text) //添加执行的动作
 QAction *addAction(const QString &text, const QObject *receiver, const char *member)
 QAction *addAction(const QString &text, const Obj *receiver, PointerToMemberFunctionOrFunctor method)
 QAction *addAction(const QString &text, Functor functor)
 QAction *addMenu(QMenu *menu) //添加菜单或菜单项
 QMenu *addMenu(const QString &title)
 QMenu *addMenu(const QIcon &icon, const QString &title)

2、工具栏的设置:QToolBar
 QAction *addAction(const QString &text)
 QAction *addAction(const QIcon &icon, const QString &text)
 QAction *addAction(const QString &text, const QObject *receiver, const char *member)
 QAction *addAction(const QIcon &icon, const QString &text, const QObject *receiver, const char *member)
 QAction *addAction(const QString &text, Functor functor)
 QAction *addAction(const QString &text, const QObject *context, Functor functor)
 QAction *addAction(const QIcon &icon, const QString &text, Functor functor)
 QAction *addAction(const QIcon &icon, const QString &text, const QObject *context, Functor functor)
 QAction *addWidget(QWidget *widget)
 QAction *insertWidget(QAction *before, QWidget *widget)
void setAllowedAreas(Qt::ToolBarAreas areas) //设置工具栏停靠的区域
Qt::LeftToolBarArea0x1  //左边
Qt::RightToolBarArea0x2  //右边
Qt::TopToolBarArea0x4  //顶部
Qt::BottomToolBarArea0x8  //底部
Qt::AllToolBarAreasToolBarArea_Mask  //所有区域
Qt::NoToolBarArea0  //没有
void setMovable(bool movable) //设置工具栏是否可移动
void setFloatable(bool floatable)//设置工具栏是否可浮动
3、状态栏:QStatusBar
 QStatusBar(QWidget *parent = nullptr)
 virtual ~QStatusBar()
 void addPermanentWidget(QWidget *widget, int stretch = 0)
 void addWidget(QWidget *widget, int stretch = 0)
 QString currentMessage() const
 int insertPermanentWidget(int index, QWidget *widget, int stretch = 0)
 int insertWidget(int index, QWidget *widget, int stretch = 0)
 bool isSizeGripEnabled() const
 void removeWidget(QWidget *widget)
 void setSizeGripEnabled(bool)
信号:
 void messageChanged(const QString &message)//消息变化时触发该信号

    //设置右下角是否有斜三角网格图标
    ui->statusbar->setSizeGripEnabled(false);
    //向状态栏中添加基本控件
//    this->btn1->setText("100%");
//    this->btn2->setText("UTF-8");
    this->btn4->setFlat(true);
    this->btn5->setFlat(true);
    this->btn6->setFlat(true);
//    ui->statusbar->addWidget(this->btn4);
//    ui->statusbar->addWidget(this->btn2);
//    statusBar()->addWidget(this->btn1);
    ui->statusbar->addPermanentWidget(this->btn5);
    ui->statusbar->addPermanentWidget(this->btn6);
    ui->statusbar->showMessage("notebook load....",5000);
    ui->statusbar->clearMessage();
    connect(this->btn5,SIGNAL(clicked()),this,SLOT(add_Chu()));

4、工作区:QDockWidget
 void setCentralWidget(QWidget *widget)//向中心工作区中添加基本的控件
 QDockWidget(QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags())
 QDockWidget(const QString &title, QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags())
 virtual ~QDockWidget()
 Qt::DockWidgetAreas allowedAreas() const
 QDockWidget::DockWidgetFeatures features() const
 bool isAreaAllowed(Qt::DockWidgetArea area) const
 bool isFloating() const
 void setAllowedAreas(Qt::DockWidgetAreas areas)
 void setFeatures(QDockWidget::DockWidgetFeatures features)
 void setFloating(bool floating)
 void setTitleBarWidget(QWidget *widget)
 void setWidget(QWidget *widget)
 QWidget *titleBarWidget() const
 QAction *toggleViewAction() const
 QWidget *widget() const

    //工作区:QDockWidget
    //向中心工作区中添加纯文本编辑框
    QStringList list1;
    list1<<"星期一"<<"星期二";
    this->comboBox1->addItems(list);
    this->setCentralWidget(this->plainTextEdit);
    this->dockWidget->setWidget(this->comboBox1);
    this->dockWidget->setFloating(true);
    this->dockWidget->setFeatures(QDockWidget::NoDockWidgetFeatures);//工作区不能被移动、浮动
    this->dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea);
    this->addDockWidget(Qt::AllDockWidgetAreas,this->dockWidget);


作业:
    (1)//实现食堂满意度调查表
    要求:
        (1)设置10个选项,选项题目自由返回
        (2)每个选项下分4个选择,最好的选择分数为10分
        (3)用户可以自行填写满意度调查表
        (4)实现对满意度分值的计算,并给出相关建议(根据不同的分段,建议不同)
        (5)用户必须将每个选项填写完成,如果没有填写完,则给予用户提示
例如:
    你对食堂早餐满意度
        很好:10       一般:6               不好:4              很差:0
    (2)实现滑动条和进度条的相互控制
    (3)试着模拟记事本的菜单栏的搭建

七、常用对话框
1、字体对话框:QFontDialog
 QFont getFont(bool *ok, const QFont &initial, QWidget *parent = nullptr, const QString &title = QString(), QFontDialog::FontDialogOptions options = FontDialogOptions())
返回值:QFont类型--字体
参数1:如果字体设置成功,ok返回true,否则返回false
参数2:设置初始字体
参数3:指定父对象
参数4:指定对话框标题
 QFont getFont(bool *ok, QWidget *parent = nullptr)
返回值:QFont类型--字体
参数1:如果字体设置成功,ok返回true,否则返回false
参数2:指定父对象
2、输入对话框:QInputDialog

3、消息对话框:QMessageBox
 void about(QWidget *parent, const QString &title, const QString &text)  //about关于
 void aboutQt(QWidget *parent, const QString &title = QString())
 QMessageBox::StandardButton critical(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = Ok, QMessageBox::StandardButton defaultButton = NoButton) //critical有争议

 QMessageBox::StandardButton information(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = Ok, QMessageBox::StandardButton defaultButton = NoButton) //信息提示
返回值:QMessageBox::StandardButton返回按钮
QMessageBox::Ok0x00000400An "OK" button defined with the AcceptRole.
QMessageBox::Open0x00002000An "Open" button defined with the AcceptRole.
QMessageBox::Save0x00000800A "Save" button defined with the AcceptRole.
QMessageBox::Cancel0x00400000A "Cancel" button defined with the RejectRole.
QMessageBox::Close0x00200000A "Close" button defined with the RejectRole.
QMessageBox::Discard0x00800000A "Discard" or "Don't Save" button, depending on the platform, defined with the DestructiveRole.
QMessageBox::Apply0x02000000An "Apply" button defined with the ApplyRole.
QMessageBox::Reset0x04000000A "Reset" button defined with the ResetRole.
QMessageBox::RestoreDefaults0x08000000A "Restore Defaults" button defined with the ResetRole.
QMessageBox::Help0x01000000A "Help" button defined with the HelpRole.
QMessageBox::SaveAll0x00001000A "Save All" button defined with the AcceptRole.
QMessageBox::Yes0x00004000A "Yes" button defined with the YesRole.
QMessageBox::YesToAll0x00008000A "Yes to All" button defined with the YesRole.
QMessageBox::No0x00010000A "No" button defined with the NoRole.
QMessageBox::NoToAll0x00020000A "No to All" button defined with the NoRole.
QMessageBox::Abort0x00040000An "Abort" button defined with the RejectRole.
QMessageBox::Retry0x00080000A "Retry" button defined with the AcceptRole.
QMessageBox::Ignore0x00100000An "Ignore" button defined with the AcceptRole.
QMessageBox::NoButton0x00000000An invalid button.
参数1:指定父对象
参数2:指定标题
参数3:指定提示的文本
参数4:指定对话框中的按钮
参数5:设置默认按钮
 QMessageBox::StandardButton question(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = StandardButtons(Yes | No), QMessageBox::StandardButton defaultButton = NoButton)//有疑问
 QMessageBox::StandardButton warning(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = Ok, QMessageBox::StandardButton defaultButton = NoButton)  //警告
4、颜色对话框:QColorDialog

5、文件对话框:QFileDialog

练习:
    设计一个记事本
        (1)更改字体颜色
        (2)更改字体大小
        (3)新建记事本
        (4)查找记事本中的数据
        (5)设置消息提示
        (6)设置粘贴、复制、剪切、撤销等
        (7)使用快捷键进行第(6)步操作
        ......................


 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值