Qt学习记录

新建工程

1、main.cpp文件

#include "mywidget.h"

#include <QApplication> /* 包含一个应用程序的类 */

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

    /* 窗口对象 MainWindow  --->  QWight */
    myWidget w;

    /* 调用show方法显示窗口 */
    w.show();

    /* 程序到此,开始循环 */
    return a.exec();
}


/*
 * F4:同名文件切换
 * ctrl i:自动对齐
 * F1:帮助文档
 * ctrl b:编译
*/

2、mywidget.cpp文件

#include "mywidget.h"


myWidget::myWidget(QWidget *parent): QWidget(parent)
{

}

myWidget::~myWidget()
{

}

3、mywidget.h函数

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>

class myWidget : public QWidget
{
    Q_OBJECT

public:
    myWidget(QWidget *parent = nullptr);
    ~myWidget();
};
#endif // MYWIDGET_H

4、Prject.pro文件

# Qt包含的模块
QT       += core gui

# 大于版本4,需包含 widgets 模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# 生成exe文件名称
TARGET = project_name

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

# 源文件
SOURCES += \
    main.cpp \
    mywidget.cpp

# 头文件
HEADERS += \
    mywidget.h

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target


创建按钮

1、以顶层窗口显示一个按钮

#include "mywidget.h"
#include <qpushbutton.h>

myWidget::myWidget(QWidget *parent): QWidget(parent)
{
    /* 设置窗口大小 */
    resize(800, 600);

    /* 创建一个btn对象 */
    QPushButton * btn = new QPushButton;

    btn->show();    /* 以顶层窗口显示 */
}

myWidget::~myWidget()
{

}

2、依附本窗口显示(一)

#include "mywidget.h"
#include <qpushbutton.h>

myWidget::myWidget(QWidget *parent): QWidget(parent)
{
    /* 设置窗口大小 */
    resize(800, 600);
    

    /* 创建一个btn对象 */
    QPushButton * btn = new QPushButton("确认", this);
    btn->move(100, 100);
}

myWidget::~myWidget()
{

}

3、依附本窗口显示(二)

#include "mywidget.h"
#include <qpushbutton.h>

myWidget::myWidget(QWidget *parent): QWidget(parent)
{

    resize(800, 600);   /* 设置窗口大小 */
    setFixedSize(800, 600); /* 固定窗口大小 */

    setWindowTitle("study");

    /* 创建一个btn对象 */
    QPushButton * btn = new QPushButton;
    btn->move(100, 100);    /* 设置按钮位置 */

    /* 依附于当前窗口显示,需设置父类*/
    btn->setParent(this);
    btn->setText("确认");
}

myWidget::~myWidget()
{

}

信号和槽

  • 信号是可以连接信号
  • 一个信号可以连接多个槽函数;
  • 多个信号可以连接同一个槽函数;
  • 信号和槽函数的参数必须类型一一对应;
  • 信号和槽的参数个数是不是要一致?信号的参数个数可以多余槽函数的参数个数;

1、信号--->槽:按钮关闭窗口

#include "mywidget.h"
#include <qpushbutton.h>

myWidget::myWidget(QWidget *parent): QWidget(parent)
{

    setFixedSize(800, 600);     /* 固定窗口大小 */
    setWindowTitle("study");    /* 设置窗口名称 */

    /* 创建一个btn对象 */
    QPushButton * btn = new QPushButton("关闭", this);
    btn->move(100, 100);    /* 设置按钮位置 */

    /* 按钮(按下) ---> 窗口(关闭)*/
    connect(btn, &QPushButton::clicked, this, &QWidget::close);
}

myWidget::~myWidget()
{

}

2、信号--->信号--->槽:按钮关闭窗口

#include "mywidget.h"
#include <qpushbutton.h>

myWidget::myWidget(QWidget *parent): QWidget(parent)
{

    setFixedSize(800, 600);     /* 固定窗口大小 */
    setWindowTitle("study");    /* 设置窗口名称 */

    /* 创建一个btn对象 */
    QPushButton * btn = new QPushButton("确认关闭", this);
    btn->move(100, 100);    /* 设置按钮位置 */

    QPushButton * btn2 = new QPushButton("关闭", this);
    btn2->move(400, 100);    /* 设置按钮位置 */


    /* 按钮(按下) ---> 窗口(关闭)*/
    connect(btn, &QPushButton::clicked, this, &QWidget::close);

    /* 按钮2(按下) ---> 按钮(按下)*/
    connect(btn2, &QPushButton::clicked, btn, &QPushButton::clicked);

    /* 关闭连接 */
    disconnect(btn2, &QPushButton::clicked, btn, &QPushButton::clicked);
}

myWidget::~myWidget()
{

}

3、Lambda表达式

#include "mywidget.h"
#include <qpushbutton.h>
#include <qdebug.h>

myWidget::myWidget(QWidget *parent): QWidget(parent)
{

    setFixedSize(800, 600);     /* 固定窗口大小 */
    setWindowTitle("study");    /* 设置窗口名称 */

    /* 创建一个btn对象 */
    QPushButton * btn = new QPushButton("确认关闭", this);
    btn->move(100, 100);    /* 设置按钮位置 */

    QPushButton * btn2 = new QPushButton("关闭", this);
    btn2->move(400, 100);    /* 设置按钮位置 */


    /* 按钮(按下) ---> 窗口(关闭)*/
    connect(btn, &QPushButton::clicked, this, &QWidget::close);

    /* 使用Lambda表达式,简化流程,按钮2(按下) ---> 按钮(按下)*/
    connect(btn2, &QPushButton::clicked, this, [=](){
        btn->clicked();
        qDebug() << "调用“确认关闭”按钮" ;
    });

}

myWidget::~myWidget()
{

}

窗口管理

1、菜单栏和工具栏

#include "mywidget.h"
#include <qpushbutton.h>
#include <qdebug.h>
#include <qmenubar.h>
#include <qtoolbar.h>

myWidget::myWidget(QMainWindow *parent): QMainWindow(parent)
{

    resize(800, 600);     /* 固定窗口大小 */
    setWindowTitle("study");    /* 设置窗口名称 */

    /* 创建菜单栏 */
    QMenuBar *bar = menuBar();
    setMenuBar(bar);    /* 放置菜单栏 */

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

    /* 创建菜单项 */
    QAction *newFile =  fileMenu->addAction("新建");

    /* 添加分隔符 */
    fileMenu->addSeparator();

    QAction * openFile = fileMenu->addAction("打开");

    /* 创建工具栏 */
    QToolBar * toolBar = new QToolBar(this);
    addToolBar(Qt::LeftToolBarArea, toolBar);

    /* 设置允许停靠区域 */
    toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::BottomToolBarArea);

    /* 禁止浮动 */
    toolBar->setFloatable(false);

    /* 设置移动 */
    toolBar->setMovable(false);

    /* 复用菜单栏的选项 */
    toolBar->addAction(newFile);

    /* 添加分割线 */
    toolBar->addSeparator();

    QPushButton *btn = new QPushButton("打开", this);
    /* 工具栏中添加控件 */
    toolBar->addWidget(btn);
}

myWidget::~myWidget()
{

}

2、状态栏

#include "mywidget.h"
#include <qpushbutton.h>
#include <qdebug.h>

#include <qstatusbar.h>
#include <qlabel.h>

myWidget::myWidget(QMainWindow *parent): QMainWindow(parent)
{

    resize(800, 600);     /* 固定窗口大小 */
    setWindowTitle("study");    /* 设置窗口名称 */

    /* 创建一个状态栏,有且只有一个 */
    QStatusBar * stBar = statusBar();

    setStatusBar(stBar);    /* 设置状态栏到窗口中 */

    /* 创建一个标签控件 */
    QLabel * label = new QLabel("运行", this);
    stBar->addWidget(label);    /* 在状态栏放置一个标签,默认放在右边  */
    stBar->addPermanentWidget(label);   /* 将标签放在状态栏左边 */
}

myWidget::~myWidget()
{

}

3、铆接部件和中心部件

#include "mywidget.h"
#include <qpushbutton.h>
#include <qdebug.h>

#include <qstatusbar.h>
#include <qlabel.h>
#include <qdockwidget.h>    /* 铆接部件头文件 */
#include <qtextedit.h>

myWidget::myWidget(QMainWindow *parent): QMainWindow(parent)
{

    resize(800, 600);     /* 固定窗口大小 */
    setWindowTitle("study");    /* 设置窗口名称 */

    /* 创建铆接部件,可以有多个 */
    QDockWidget * dockWidget = new QDockWidget("浮动", this);
    addDockWidget(Qt::BottomDockWidgetArea, dockWidget);    /* 在主窗口添加铆接部件 */
    /* 仅允许在上和下停靠 */
    dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);


    /* 创建一个文本编辑器 */
    QTextEdit * edit = new QTextEdit(this);

    /* 设置中心部件,只能有一个 */
    setCentralWidget(edit);
}

myWidget::~myWidget()
{

}


添加资源文件

#include "mywidget.h"
#include <qpushbutton.h>
#include <qdebug.h>
#include <qmenubar.h>
#include <qtoolbar.h>

myWidget::myWidget(QMainWindow *parent): QMainWindow(parent)
{

    resize(800, 600);     /* 固定窗口大小 */
    setWindowTitle("study");    /* 设置窗口名称 */

    /* 创建菜单栏 */
    QMenuBar *bar = menuBar();
    setMenuBar(bar);    /* 放置菜单栏 */

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

    /* 创建菜单项 */
    QAction *newFile =  fileMenu->addAction("新建");

    /* 将图片图片保存在同一目录,并在Qt中添加资源文件 */
    newFile->setIcon(QIcon(":/Picture/res/icon.png"));
    fileMenu->addSeparator();

}

myWidget::~myWidget()
{

}

对话框

1、创建模态对话框

#include "mywidget.h"
#include <qpushbutton.h>
#include <qdebug.h>
#include <qmenubar.h>
#include <qtoolbar.h>
#include <qdialog.h>

myWidget::myWidget(QMainWindow *parent): QMainWindow(parent)
{

    resize(800, 600);     /* 固定窗口大小 */
    setWindowTitle("study");    /* 设置窗口名称 */

    /* 创建菜单栏 */
    QMenuBar *bar = menuBar();
    setMenuBar(bar);    /* 放置菜单栏 */

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

    /* 创建菜单项 */
    QAction *newFile =  fileMenu->addAction("新建");

    /* 将图片图片保存在同一目录,并在Qt中添加资源文件 */
    newFile->setIcon(QIcon(":/Picture/res/icon.png"));
    fileMenu->addSeparator();

    /* 新建(点解) ---> 对话框(弹出) */
    connect(newFile, &QAction::triggered, [=](){
        /* 创建一个对话框,分为模态(不可操作其他窗口)和非模态 */
        /* 模态对话框创建 */
        QDialog dlg(this);
        dlg.resize(100,100);
        dlg.exec();

        qDebug()<< "模态对话框";
    });
}

myWidget::~myWidget()
{

}

2、创建非模态对话框

#include "mywidget.h"
#include <qpushbutton.h>
#include <qdebug.h>
#include <qmenubar.h>
#include <qtoolbar.h>
#include <qdialog.h>

myWidget::myWidget(QMainWindow *parent): QMainWindow(parent)
{

    resize(800, 600);     /* 固定窗口大小 */
    setWindowTitle("study");    /* 设置窗口名称 */

    /* 创建菜单栏 */
    QMenuBar *bar = menuBar();
    setMenuBar(bar);    /* 放置菜单栏 */

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

    /* 创建菜单项 */
    QAction *newFile =  fileMenu->addAction("新建");

    /* 将图片图片保存在同一目录,并在Qt中添加资源文件 */
    newFile->setIcon(QIcon(":/Picture/res/icon.png"));
    fileMenu->addSeparator();

    /* 新建(点解) ---> 对话框(弹出) */
    connect(newFile, &QAction::triggered, [=](){

        /* 创建非模态窗口,必须new一个,否则在函数结束后就被释放了 */
        QDialog *dlg = new QDialog;
        dlg->resize(100,100);

        /* 关闭窗口后,释放内存 */
        dlg->setAttribute(Qt::WA_DeleteOnClose);

        /* 显示 */
        dlg->show();
    });
}

myWidget::~myWidget()
{

}

3、标准消息对话框

#include "mywidget.h"
#include <qpushbutton.h>
#include <qdebug.h>
#include <qmenubar.h>
#include <qdialog.h>
#include <qmessagebox.h>

myWidget::myWidget(QMainWindow *parent): QMainWindow(parent)
{

    resize(800, 600);     /* 固定窗口大小 */
    setWindowTitle("study");    /* 设置窗口名称 */

    /* 创建菜单栏 */
    QMenuBar *bar = menuBar();
    setMenuBar(bar);    /* 放置菜单栏 */

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

    /* 创建菜单项 */
    QAction *newFile =  fileMenu->addAction("新建");
    fileMenu->addSeparator();

    /* 新建(点解) ---> 对话框(弹出) */
    connect(newFile, &QAction::triggered, [=](){

        /* 消息对话框 */
//        QMessageBox::information(this, "info", "信息");

        /* 错误对话框 */
//        QMessageBox::critical(this, "错误","配置错误");

        /* 提问对话框 */
//        QMessageBox::StandardButton value = QMessageBox::question(this, "question", "是否确认更改", QMessageBox::Yes | QMessageBox::No);
//        if(value == QMessageBox::Yes)
//        {
//            qDebug()<< "yes";
//        }

        /* 警告对话框 */
        QMessageBox::warning(this, "waring", "警告");

    });


}

myWidget::~myWidget()
{

}

定时器

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qtimer.h> /* 定时器 */
#include <qdebug.h>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    /* 创建一个定时器 */
    QTimer * timer1 = new QTimer;
    
    timer1->start(1000);    /* 定时器步长 */
    
    /* 定时器(超时) ---> 窗口(打印) */
    connect(timer1, &QTimer::timeout,[](){
        qDebug("hello!\r\n");
    });
}

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

导入QSS文件

将样式导入到资源文件

#include "widget.h"

#include <QApplication>

#include <qfile.h>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    /* qss样式配置 */
    QFile styleFile(":/res/style.qss"); /* 打开一个样式文件 */
    if(styleFile.open(QFile::ReadOnly))
    {
        /* 读取样式,并设定 */
        QString styleSheet = QString(styleFile.readAll());
        a.setStyleSheet(styleSheet);
    }

    Widget w;
    w.show();
    return a.exec();
}
posted @ 2025-11-07 20:59  比特向阳  阅读(13)  评论(0)    收藏  举报