前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >QT入门学习——从信号和槽到对话框,各种控件以及自定义控件

QT入门学习——从信号和槽到对话框,各种控件以及自定义控件

原创
作者头像
Arya
修改2024-10-31 13:56:52
修改2024-10-31 13:56:52
4220
举报
文章被收录于专栏:后端开发专栏后端开发专栏

引出


QT入门学习——从信号和槽到对话框,各种控件以及自定义控件

qt的使用

代码语言:java
复制
//类名首字母大写,单词和单词之间首字母大写
//函数名变量名称首字母小写,单词和单词之间首字母大写
//快捷键
//注释ctrl +/
// 运行 ctrl +r
// 编译 ctrl b
//字体缩放ctr1+ 鼠标滚轮
//查找 ctrl+f
//整行移动 ctrl+shift+↑或者,
//帮助文档F1
//自动对齐 ctrl i;
//同名之间的.h和.cpp切换 F4
//帮助文档第一种方式F1第二种左侧按钮 1
//D:\MyPrograme\QT\5.14.2\mingw73_32\bin

创建第一个Qt程序

2.1点击创建项目后,选择项目路径到以及给项目起名称

2.2名称·不能有中文不能有空格

2.3路径·不能有中文路径

2.4默认创建有窗口类,yWidget,基类有三种选择:QWidget、QMainWindowQDialog

2.5 main函数

2.5.1 QApplication a应用程序对象,有且仅有一个

2.5.2 mywidget w;实例化窗口对象

2.5.3 w.show0调用show函数显示窗口

2.5.4 return a.exec(让应用程序对家进入消总循环机,制中,代码阻塞到当前行

代码语言:java
复制
#include "mywidget.h"

#include <QApplication> // 应用程序头文件
#include <QLabel>

// main程序入口 argc 命令行变量数量,argv命令行变量数组
int main(int argc, char *argv[])
{
    // 应用程序对象,qt中有且只有一个
    QApplication a(argc, argv);

    // 窗口默认不显示,需要调用show方法
    myWidget w;

    w.show();

    // 进入消息循环,死循环
    return a.exec();
}

3按钮控件常用API

3.1 创建QPushButton*btn=new QPushButton

3.2 设置父亲setParent(this

3.3 设置文本 setText(文字")

3.4 设置位置move宽,高W

3.5 重新指定商口大小 resize

3.6 设置窗口标题 setwindowTitle

3.7 设置窗口固定大小setFixedsize

代码语言:java
复制
#include "mywidget.h"

#include <QLabel>
#include <QPushButton>


myWidget::myWidget(QWidget *parent)
    : QWidget(parent)
{
    QLabel *label = new QLabel("hello qt");
    label->setParent(this);

    // 创建按钮
    QPushButton *btn = new QPushButton("第二个按钮",this);

    btn->move(100,100);
    // 充值窗口大小
    resize(600,400);

    setWindowTitle("第一个窗口");
}

myWidget::~myWidget()
{
}

对象树概念

4对像树

4.1 当创建的对象在堆区时候,如果指定的父亲是QObject派生下来的类或者QObject子类派生下来的类,可以不用管理释放的操作,将对象会放入到对象树中。

4.2 一定程度上简化了内存回收机制

信号signal槽slot

信号的发送者,发送的具体信号,信号的接受者,信号的处理(槽)

信号槽的优点,松散耦合,信号发送端和接受端本身是没有关联的,通过 connect连接将两端耦合在一起

6信号和槽

6.1连接函数:connect

6.2参数

6.2.1参数1 信号的发送者

6.2.2参数2 发送的信号(函数地址)

6.2.3参数3 信号的接受者

6.2.4参数4 处理的槽函数(函数的地址)

6.3松散羯合

自定义信号和槽

1.自定义信号

写到signals下

返回void

需要声明,不需要实现

可以有参数,可以重戟

2.自定义槽

返回void

需要声明,也需要实现

可以有参数,可以重载

写到public slot下或者public或者全局函数

3.建立连接

代码语言:java
复制
// 老师饿了,学生请吃饭
connect(te,&Teacher::hungry,st,&Student::treat);

4.进行触发

自定义信号重载

当自定义信号和槽出现重载

8.1 需要利用还数指针明确指向函数的地址·

8.2void(Teacher::tsignal )QString )=&Teacher::hungry;

8.3 QString转成char *

8.3.1.ToUtf80转为QByteArray

8.3.2.Data0转为Char *

8.4信号可以连接信号

8.5断开信号disconnect

带参数的

代码语言:java
复制
    void (Teacher::*teacherSignal)(QString) = &Teacher::hungry;
    void (Student::*StudentSlot)(QString) = &Student::treat;
代码语言:java
复制
void Student::treat(QString foodName){
    // QString -> char * 先转成QByteArray(.toUtf8())  再转成Char* ()
    qDebug() << "请老师吃。。。" << foodName.toUtf8().data();
}

按钮触发

代码语言:java
复制
    // 用一个按钮调用下课
    QPushButton *btn = new QPushButton("下课了",this);

    // 重置窗口daxiao
    this->resize(600,400);

    connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);

信号触发信号

代码语言:java
复制
    // 无参的信号和槽连接
    void (Teacher::*teacherSignal2)(void) = &Teacher::hungry;
    void (Student::*StudentSlot2)(void) = &Student::treat;
    connect(te,teacherSignal2,st,StudentSlot2);

    // 信号连接信号
    connect(btn,&QPushButton::clicked,te,teacherSignal2);

断开信号disconnect

拓展

1、信号是可以连接信号

2、一个信号可以连接多个槽函数

3、多个信号可以连接同一个糟函数

4、信号和槽函数的参数必须类型一一对应

5、信号和槽的参数个数是不是要一致?信号的参数个数可以多余槽函数的参数个数

connect(信号的发送者,发送的信号signal信号),信号接受者,槽函数SLOT)

优点:参数直观

缺点:编译器不会检测爸数类型:

lambda表达式

代码语言:java
复制
    [=](){
        btn->setText("aaa");
    }();

返回值

代码语言:java
复制
    int ret = []()->int{return 1000;}();
    qDebug() << "ret = " << ret;

mutable修饰

代码语言:java
复制
    QPushButton *myBtn1 = new QPushButton(this);
    QPushButton *myBtn2 = new QPushButton(this);
    myBtn1->move(100,100);
    int m = 10;
    connect(myBtn1,&QPushButton::clicked,this,
            [m]()mutable {m=100+10;qDebug()<< m;});
    connect(myBtn2,&QPushButton::clicked,this,
            [=](){qDebug()<<m;});
    qDebug() << m;

案例

代码语言:java
复制
    QPushButton * btnClose = new QPushButton;
    btnClose->setText("close");
    btnClose->move(100,0);
    btnClose->setParent(this);
    connect(btnClose,&QPushButton::clicked,this,
            [=](){
        btnClose->setText("关闭");
        emit te->hungry("娃哈哈");
//        this->close();
    });

打开关闭窗口案例

代码语言:java
复制
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 窗口
    QWidget *myWidget = new QWidget;
    myWidget->resize(200,200);

    QPushButton *btnOpen = new QPushButton("打开",this);
    this->resize(600,400);
    connect(btnOpen,&QPushButton::clicked,
            this,[=](){
        myWidget->show();
    });

    QPushButton *btnclose = new QPushButton("关闭",this);
    btnclose->move(200,0);
    connect(btnclose,&QPushButton::clicked,
            this,[=](){
        myWidget->close();
    });


    // 一个按钮控制两个窗口
    QWidget *myWidget1 = new QWidget;
    myWidget1->resize(300,100);

    QPushButton *myBtn = new QPushButton("open",this);
    myBtn->move(50,50);

    connect(myBtn,&QPushButton::clicked,this,
            [=](){
    if(myBtn->text()=="open"){
        myBtn->setText("close");
        myWidget1->show();
    }
    else {
        myBtn->setText("open");
        myWidget1->close();
    }
    });

}

Widget::~Widget()
{
    delete ui;
}

qt的菜单栏工具栏

菜单栏,工具栏

1QMainWindow

1.1菜单栏最多有一个

1.1.1 QMenuBar * bar MenuBar();

1.1.2 setMenuBar(bar)

1.1.3 QMenu * fileMenu=bar->addMenu(文件") 创建菜单

1.1.4 QAction * newAction=ileMenu->addAction(新建");创建菜单项;

1.1.5 添加分割线fileMenu->adSeparator();

1.2工具栏可以有多个

1.2.1 QToolBar * toolbar new QToolBar(this);

1.2.2 addToolBar(默认停靠区域,toolbar )Qt::LeftToolBarArea

1.2.3 设置后期停靠区域,设置浮动,设置移动

1.2.4 添加菜单项或者添加小控件

状态栏,浮动窗口

代码语言:java
复制
#include "mainwindow.h"
#include <QMenuBar>
#include <qtoolbar.h>
#include <QStatusBar>
#include <QLabel>
#include <QDockWidget>
#include <QTextEdit>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{

    // 重置窗口大小
    resize(600,400);
    QMenuBar *bar = menuBar();
    setMenuBar(bar);
    QMenu *fileMenu = bar->addMenu("文件");
    QMenu *editMenu = bar->addMenu("编辑");

    // 创建菜单项, 最多只能有1个
    fileMenu->addAction("新建");
    // 添加分割符
    fileMenu->addSeparator();
    QAction *openAc= fileMenu->addAction("打开");


    // 工具栏 可以有多个
    QToolBar * toolbar = new QToolBar(this);
    addToolBar(Qt::LeftToolBarArea,toolbar);
    // 只允许左右停靠
    toolbar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
    // 设置浮动
    toolbar->setFloatable(false);
    // 设置移动,总开关 toolbar->setMovable(false);

    toolbar->addAction("工具");
    toolbar->addAction(openAc);

    // 状态栏,最多一个
    QStatusBar *stBar = statusBar();
    setStatusBar(stBar);
    // 放标签控件
    QLabel *label = new QLabel("提示信息",this);
    stBar->addWidget(label);
    QLabel *labelRight = new QLabel("右侧提示信息",this);
    stBar->addPermanentWidget(labelRight);

    // 铆接部件,浮动窗口,可以有多个
    QDockWidget * dockWidget = new QDockWidget("浮动",this);
    addDockWidget(Qt::BottomDockWidgetArea,dockWidget);
    dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);

    // 设置中心组件, 只能有一个
    QTextEdit *edit = new QTextEdit(this);
    setCentralWidget(edit);

}

MainWindow::~MainWindow()
{
}

属性设计ui

编辑控件

添加图片

对话框

模态方式

模态:不可对其他窗口操作;非模态:可操作;

代码语言:java
复制
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 点击新建
    connect(ui->actionNew,&QAction::triggered,
            [=](){
        // 对话框分类,
        // 模态:不可对其他窗口操作;非模态:可操作;
        QDialog dlg(this);
        dlg.resize(200,200);
        dlg.exec();
        qDebug() << "模态对话框弹出,阻塞了";
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

非模态方式

代码语言:java
复制
        // 非模态对话框
        QDialog *dlg2 = new QDialog (this);
        dlg2->resize(200,200);
        dlg2->show();
        dlg2->setAttribute(Qt::WA_DeleteOnClose);
        qDebug() << "非模态对话框弹出";

系统对话框

消息框

代码语言:java
复制
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
#include <QDebug>
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 点击新建
    connect(ui->actionNew,&QAction::triggered,
            [=](){
        // 错误对话框
//        QMessageBox::critical(this,"错误","一个错误的弹窗");

        // 消息对话框
        // 参数1父亲 参数2标题 参数3提示内容 参数4按键类型 参数5默认关联回车按键
        QMessageBox::StandardButton choose = QMessageBox::question(
                    this,"选择","是否选择",QMessageBox::Save | QMessageBox::Cancel,
                    QMessageBox::Save);

        if(QMessageBox::Save==choose){
            qDebug() << "选择的是保存";
        }else {
            qDebug() << "选择的是取消";
        }
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

颜色框

代码语言:java
复制
        QColor color = QColorDialog::getColor(QColor(255,0,0));
        qDebug() << "color=" << color.red();

文件框

代码语言:java
复制
        //文件对话框
        // 参数1父亲 参数2标题 参数3默认打开路径 参数4过滤文件格式
        //返回值是选取的路径

        QString str = QFileDialog::getOpenFileName(
                    this,"打开文件","D:\\MyFiles\\myLearn\\QT","(*.txt)");
        qDebug() << "filePath = " << str;

界面布局

利用布局方式给窗口进行美化

选取widget进行布局,水平布局、垂直布局、栅格布局

给用户名、密码、登陆、退出按钮进行布局:

默认窗口和控件之间有9间隙,可以调整layoutLeftMargin

利用弹篝进行布局

默认框框有9像素

输入框

密码的输入

tool按钮

单选框

多选框

半选状态,需要进入如下的设置

listWidget

代码语言:java
复制
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 单选按钮 男默认选中
    ui->rBtnMan->setChecked(true);

    // 选中女,打印
    connect(ui->rBtnWoman,&QRadioButton::clicked,this,
            [=](){
        qDebug() << "选中了女的";
    });

    // 多选
    connect(ui->checkBox,&QCheckBox::stateChanged,this,
            [=](int state){
        qDebug() << "多选框" << state;
    });

    // 利用listWidget写诗
//    QListWidgetItem *item = new QListWidgetItem("锄禾日当午");
//    // 将这一行放入控件中
//    ui->listWidget->addItem(item);
//    item->setTextAlignment(Qt::AlignHCenter);

    // QString
    QStringList list;
    list << "锄禾日当午" << "汗滴禾下土"
         << "谁知盘中餐" << "粒粒皆辛苦";
    ui->listWidget->addItems(list);

}

Widget::~Widget()
{
    delete ui;
}

QTreeWidget

代码语言:java
复制
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // treeWidget树控件

    // 设置水平头
    ui->treeWidget->setHeaderLabels(
                QStringList() << "英雄"<< "英雄介绍"); // 匿名对象

    QTreeWidgetItem *itemL = new QTreeWidgetItem(QStringList() << "力量");
    QTreeWidgetItem *itemM = new QTreeWidgetItem(QStringList() << "敏捷");
    QTreeWidgetItem *itemZ = new QTreeWidgetItem(QStringList() << "智力");
    // 加顶层节点
    ui->treeWidget->addTopLevelItem(itemL);
    ui->treeWidget->addTopLevelItem(itemM);
    ui->treeWidget->addTopLevelItem(itemZ);

    // 追加自节点
    QStringList heroL1;
    heroL1 << "力量超强" << "很厉害";
    QTreeWidgetItem *l = new QTreeWidgetItem(heroL1);
    itemL->addChild(l);

}

Widget::~Widget()
{
    delete ui;
}

QTableWidget

代码语言:java
复制
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // tableWidget控件
    // 设置列数
    ui->tableWidget->setColumnCount(3);
    // 设置 表头
    ui->tableWidget->setHorizontalHeaderLabels(
                QStringList() << "姓名" << "性别" << "年龄");

    // 设置行数
    ui->tableWidget->setRowCount(4);

    // 设置正文
    ui->tableWidget->setItem(0,0,new QTableWidgetItem("张三"));

    QStringList nameList;
    nameList << "张三" << "李四" << "王五";

    QList<QString> sexList;
    sexList << "男" << "女" <<"男";

    for (int i=0;i <3 ;i++) {
        int col = 0;
        // nameList[i] 越界直接就挂了。
        ui->tableWidget->setItem(i,col++,new QTableWidgetItem(nameList[i]));
        // sexList.at(i) 越界抛出异常
        ui->tableWidget->setItem(i,col++,new QTableWidgetItem(sexList.at(i)));
        //nt 转为Qstring: QString::number(i+18) i
        ui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(i+18)));
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}

其他控件

stackedWidget

代码语言:java
复制
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 栈控件的使用

    //默认页面
    ui->stackedWidget->setCurrentIndex(2);

    // scrollArea的使用
    connect(ui->btnHome,&QPushButton::clicked,
            [=](){
        ui->stackedWidget->setCurrentIndex(1);
    });
    connect(ui->btnPush,&QPushButton::clicked,
            [=](){
        ui->stackedWidget->setCurrentIndex(0);
    });
    connect(ui->btnTool,&QPushButton::clicked,
            [=](){
        ui->stackedWidget->setCurrentIndex(2);
    });

}

Widget::~Widget()
{
    delete ui;
}

combox下拉框

代码语言:java
复制
    // 下拉框
    ui->comboBox->addItems(QStringList() << "宝马" << "奔驰" << "拖拉机");

    // 点击按钮
    connect(ui->selectTuo,&QPushButton::clicked,
            [=](){
        ui->comboBox->setCurrentIndex(2);
//        ui->comboBox->setCurrentText("拖拉机");
    });

label标签

代码语言:java
复制
    // 图片
    ui->lbl_img->setPixmap(QPixmap(":/sw.png"));

自定义控件

自定义一个控件

自定义控件定义方法函数

代码语言:java
复制
#include "smallwid.h"
#include "ui_smallwid.h"

SmallWid::SmallWid(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SmallWid)
{
    ui->setupUi(this);

    // QSpinBox移动,QSlider跟着移动
    void(QSpinBox::* spSignal) (int) = &QSpinBox::valueChanged;
    connect(ui->spinBox,spSignal,
            ui->horizontalSlider,&QSlider::setValue);

    // QSlider滑动,QSpinBox滑动
    connect(ui->horizontalSlider, &QSlider::valueChanged,
            ui->spinBox,&QSpinBox::setValue);

}

// 设置和获取数字

void SmallWid::setNum(int num)
{
    ui->spinBox->setValue(num);
}

int SmallWid::getNum()
{
    return ui->spinBox->value();
}

SmallWid::~SmallWid()
{
    delete ui;
}

widget窗口调用函数

代码语言:java
复制
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 点击获取,获取到控件当前的值
    connect(ui->btnGetNum,&QPushButton::clicked,
            [=](){
        int v = ui->widget->getNum();
        qDebug() << "获取的值为:" << v;
    });

    // 设置到一半
    connect(ui->btnSetHarlf,&QPushButton::clicked,
            [=](){
        ui->widget->setNum(50);
    });
}

Widget::~Widget()
{
    delete ui;
}

总结

QT入门学习——从信号和槽到对话框,各种控件以及自定义控件

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引出
  • qt的使用
    • 创建第一个Qt程序
    • 对象树概念
    • 信号signal槽slot
    • 自定义信号和槽
      • 1.自定义信号
      • 2.自定义槽
      • 3.建立连接
      • 4.进行触发
    • 自定义信号重载
      • 带参数的
      • 按钮触发
      • 信号触发信号
      • 拓展
    • lambda表达式
      • 返回值
      • mutable修饰
      • 案例
    • 打开关闭窗口案例
  • qt的菜单栏工具栏
    • 菜单栏,工具栏
    • 状态栏,浮动窗口
  • 属性设计ui
    • 编辑控件
    • 添加图片
  • 对话框
    • 模态方式
    • 非模态方式
    • 系统对话框
      • 消息框
      • 颜色框
      • 文件框
    • 界面布局
      • 输入框
      • tool按钮
      • 单选框
      • 多选框
      • listWidget
      • QTreeWidget
      • QTableWidget
    • 其他控件
      • stackedWidget
      • combox下拉框
      • label标签
  • 自定义控件
    • 自定义一个控件
    • 自定义控件定义方法函数
    • widget窗口调用函数
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档