Qt-C++基础界面开发(1- 创建程序和简单Buttons控件的使用)

1 Qt介绍

1.1 Qt的安装

参考帖子:Qt5.9.9 Windows版本安装

1.2 Qt教程

本栏不涉及Qt的软件使用的具体教程

1.3 Qt新建应用程序

  • 1、在Qt界面的栏目文件新建文件或项目...(ctrl+n)
  • 2、选择ApplicationQt Widget application如下图所示:

在这里插入图片描述

  • 命名文件项目名称为例如Test,其余均为默认

在这里插入图片描述

  • 此时查看Test项目的.pro文件如下所示
QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# 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 \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

FORMS += \
    mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
  • 此时在Qt界面的运行按钮Ctrl+R运行查看是否报错

在这里插入图片描述

2 Qt界面开发的基本操作

2.1 Qt designer界面的简单介绍

控件的变量名:如下图所示其中

  • ①处文本可以被源文件的代码给替换掉,本身就是个显示出来的text
  • ②和③处的文本是同一个内容,是对按钮这个参数的命名即在编程中的变量名,在源文件中对这个按钮所要执行的所有操作,都用这个变量名来调用

在这里插入图片描述

修改样式属性:如下图所示,右击控件,弹出如下所示菜单,选择改变样式表...

在这里插入图片描述

  • 其中添加资源可以添加控件的背景图片,但是图片作为资源文件,需要提前在Qt中添加进去,如后续的2.2
  • 修改字体和颜色等,对控件的字体、控件的颜色等进行修改。

控制控件的尺寸大小:对控件的尺寸大小控制是比较复杂的,其中对控件的属性设置控制其原始的显示尺寸,以及后续的最大、最小尺寸,并且对适应缩放比例的布局,需要不断尝试。
在这里插入图片描述

2.2 添加资源文件

  • 1、在项目导航栏右键选择项目,选择 Add New...(或者新建文件或者项目中在Qt栏目中也能找到)

在这里插入图片描述

  • 2、选择Qt Resource file,如下图所示,并且命名为image,并且对应添加到Test项目的Test.pro里,如下图所示

在这里插入图片描述

  • 3、新建项目前缀:Add Prefix添加资源前缀即资源的分组,分组命名为qtimage此时点击Add Files添加资源文件,如下所示的qt.jpg,添加完资源后需要运行一下项目,至此资源文件添加完成。

在这里插入图片描述

  • 4、删除资源文件打开文件后,点击删除即可
    在这里插入图片描述

  • 5、后续修改资源文件只需要右键Resource后点击Open in Editor即可对资源文件进行修改.

在这里插入图片描述

2.3 槽函数和Lambda函数控制控件

下面以Push Button的基本操作为例子,对控件进行控制,控件的触发和实现流程如下所示:

在这里插入图片描述

2.3.1 槽函数实现操作

1、Qt designer的界面设计控件
2、在该界面的 .h文件下设计public slots,然后声明槽函数
3、在该界面的 .cpp文件实现该槽函数(定义)

1、添加ui进qt designer,并对控件命名,如下图所示
在这里插入图片描述
2、在界面的.h文件声明槽函数,注意**需要声明public slots,然后声明槽函数**

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

// 声明slots
public slots:
    // 在public下声明槽函数
    // 因为采用clicked信号,不传参数
    void slot_pbt();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

3、在界面的.cpp文件对控件的槽函数进行实现操作,注意此时的connect与后续的lambda表达式的表示方法是不一样的

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 代码在此后面添加
    connect(ui->pbt,SIGNAL(clicked(bool)),this,SLOT(slot_pbt()));
}

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

// 命名空间下实现槽函数
void MainWindow::slot_pbt(){
    ui->pbt->setText("hello");
}

4、实现效果如图
在这里插入图片描述

2.3.2 Lambda函数实现操作

1、添加ui进qt designer,并对控件命名
2、头文件包含QPushButton类
3、在该项目的cpp文件直接采用lambda表达式进行编程

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 代码在此后面添加

    //connect函数的参数分别为该界面的控件、信号、作用界面、槽函数
    //采用lambda表达式替代了槽函数
    //实现功能,按钮按下,修改按钮的名称从按键-->hello
    connect(ui->pbt,&QPushButton::clicked,this,[=](){
        ui->pbt->setText("hello");
    });
}

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

2.3.3 槽函数和Lambda实现的区别

  • 对于某些简单的顺序执行流程可以采用lambda表达式进行实现
  • lambda表达式的connect和槽函数实现的方式不一样

3 Buttons控件的简单使用

3.1 Push Button的基本操作

见面2.3节

3.2 CheckBox的基本操作

1、添加ui进qt designer,并对控件命名
2、头文件包含QPushButton类
3、在该项目的cpp文件直接采用lambda表达式进行编程

1、设计UI的控件

在这里插入图片描述
2、利用lambda表达式编程

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 代码在此后面添加
    // 头文件进行include<QPushButton>
    // 槽函数的:SIGNAL(stateChanged(int))
    connect(ui->ckb,&QPushButton::clicked,this,[=]{
        int state = ui->ckb->checkState();
        if (state ==2)
            ui->ckb->setText("hello");
        else
            ui->ckb->setText("未勾选不为2");
    });


}

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

3、实现效果

在这里插入图片描述

  • 1
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++写的一个简单界面演示系统 void CMiniDrawDoc::AddFigure (CFigure *PFigure) { m_FigArray.Add (PFigure); SetModifiedFlag (); } CFigure *CMiniDrawDoc::GetFigure (int Index) { if (Index m_FigArray.GetUpperBound ()) return 0; return (CFigure *)m_FigArray.GetAt (Index); } int CMiniDrawDoc::GetNumFigs () { return m_FigArray.GetSize (); } void CMiniDrawDoc::DeleteContents() { // TODO: Add your specialized code here and/or call the base class int Index = m_FigArray.GetSize (); while (Index--) delete m_FigArray.GetAt (Index); m_FigArray.RemoveAll (); CDocument::DeleteContents(); } void CMiniDrawDoc::OnEditClearAll() { // TODO: Add your command handler code here DeleteContents (); UpdateAllViews (0); SetModifiedFlag (); } void CMiniDrawDoc::OnUpdateEditClearAll(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable (m_FigArray.GetSize ()); } void CMiniDrawDoc::OnEditUndo() { // TODO: Add your command handler code here int Index = m_FigArray.GetUpperBound (); if (Index > -1) { delete m_FigArray.GetAt (Index); m_FigArray.RemoveAt (Index); } UpdateAllViews (0); SetModifiedFlag (); } void CMiniDrawDoc::OnUpdateEditUndo(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable (m_FigArray.GetSize ()); } // implementation of figure classes: IMPLEMENT_SERIAL (CFigure, CObject, 3) CRect CFigure::GetDimRect () { return CRect (min (m_X1, m_X2), min (m_Y1, m_Y2), max (m_X1, m_X2) + 1, max (m_Y1, m_Y2) + 1); } void CFigure::Serialize (CArchive& ar) { if (ar.IsStoring ()) ar << m_X1 << m_Y1 << m_X2 << m_Y2 <> m_X1 >> m_Y1 >> m_X2 >> m_Y2 >> m_Color; } IMPLEMENT_SERIAL (CLine, CFigure, 3) CLine::CLine (int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness) { m_X1 = X1; m_Y1 = Y1; m_X2 = X2; m_Y2 = Y2; m_Color = Color; m_Thickness = Thickness; } void CLine::Serialize (CArchive& ar) { CFigure::Serialize (ar); if (ar.IsStoring ()) ar <> m_Thickness; } void CLine::Draw (CDC *PDC) { CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_SOLID, m_Thickness, m_Color); POldPen = PDC->SelectObject (&Pen); // draw figure: PDC->MoveTo (m_X1, m_Y1); PDC->LineTo (m_X2, m_Y2); // remove pen/brush: PDC->SelectObject (POldPen); } IMPLEMENT_SERIAL (CRectangle, CFigure, 3) CRectangle::CRectangle (int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness) { m_X1 = X1; m_Y1 = Y1; m_X2 = X2; m_Y2 = Y2; m_Color = Color; m_Thickness = Thickness; } void CRectangle::Serialize (CArchive& ar) { CFigure::Serialize (ar); if (ar.IsStoring ()) ar <> m_Thickness; } void CRectangle::Draw (CDC *PDC) { CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_INSIDEFRAME, m_Thickness, m_Color); POldPen = PDC->SelectObject (&Pen); PDC->SelectStockObject (NULL_BRUSH); // draw figure: PDC->Rectangle (m_X1, m_Y1, m_X2, m_Y2); // remove pen/brush: PDC->SelectObject (POldPen); } IMPLEMENT_SERIAL (CRectFill, CFigure, 3) CRectFill::CRectFill (int X1, int Y1, int X2, int Y2, COLORREF Color) { m_X1 = min (X1, X2); m_Y1 = min (Y1, Y2); m_X2 = max (X1, X2); m_Y2 = max (Y1, Y2); m_Color = Color; } void CRectFill::Draw (CDC *PDC) { CBrush Brush, *POldBrush; CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_INSIDEFRAME, 1, m_Color); POldPen = PDC->SelectObject (&Pen); Brush.CreateSolidBrush (m_Color); POldBrush = PDC->SelectObject (&Brush); // draw figure: PDC->Rectangle (m_X1, m_Y1, m_X2, m_Y2); // remove pen/brush: PDC->SelectObject (POldPen); PDC->SelectObject (POldBrush); } IMPLEMENT_SERIAL (CRectRound, CFigure, 3) CRectRound::CRectRound (int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness) { m_X1 = min (X1, X2); m_Y1 = min (Y1, Y2); m_X2 = max (X1, X2); m_Y2 = max (Y1, Y2); m_Color = Color; m_Thickness = Thickness; } void CRectRound::Serialize (CArchive& ar) { CFigure::Serialize (ar); if (ar.IsStoring ()) ar <> m_Thickness; } void CRectRound::Draw (CDC *PDC) { CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_INSIDEFRAME, m_Thickness, m_Color); POldPen = PDC->SelectObject (&Pen); PDC->SelectStockObject (NULL_BRUSH); // draw figure: int SizeRound = (m_X2 - m_X1 + m_Y2 - m_Y1) / 6; PDC->RoundRect (m_X1, m_Y1, m_X2, m_Y2, SizeRound, SizeRound); // remove pen/brush: PDC->SelectObject (POldPen); } IMPLEMENT_SERIAL (CRectRoundFill, CFigure, 3) CRectRoundFill::CRectRoundFill (int X1, int Y1, int X2, int Y2, COLORREF Color) { m_X1 = min (X1, X2); m_Y1 = min (Y1, Y2); m_X2 = max (X1, X2); m_Y2 = max (Y1, Y2); m_Color = Color; } void CRectRoundFill::Draw (CDC *PDC) { CBrush Brush, *POldBrush; CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_INSIDEFRAME, 1, m_Color); POldPen = PDC->SelectObject (&Pen); Brush.CreateSolidBrush (m_Color); POldBrush = PDC->SelectObject (&Brush); // draw figure: int SizeRound = (m_X2 - m_X1 + m_Y2 - m_Y1) / 6; PDC->RoundRect (m_X1, m_Y1, m_X2, m_Y2, SizeRound, SizeRound); // remove pen/brush: PDC->SelectObject (POldPen); PDC->SelectObject (POldBrush); } IMPLEMENT_SERIAL (CCircle, CFigure, 3) CCircle::CCircle (int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness) { m_X1 = min (X1, X2); m_Y1 = min (Y1, Y2); m_X2 = max (X1, X2); m_Y2 = max (Y1, Y2); m_Color = Color; m_Thickness = Thickness; } void CCircle::Serialize (CArchive& ar) { CFigure::Serialize (ar); if (ar.IsStoring ()) ar <> m_Thickness; } void CCircle::Draw (CDC *PDC) { CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_INSIDEFRAME, m_Thickness, m_Color); POldPen = PDC->SelectObject (&Pen); PDC->SelectStockObject (NULL_BRUSH); // draw figure: PDC->Ellipse (m_X1, m_Y1, m_X2, m_Y2); // remove pen/brush: PDC->SelectObject (POldPen); } IMPLEMENT_SERIAL (CCircleFill, CFigure, 3) CCircleFill::CCircleFill (int X1, int Y1, int X2, int Y2, COLORREF Color) { m_X1 = min (X1, X2); m_Y1 = min (Y1, Y2); m_X2 = max (X1, X2); m_Y2 = max (Y1, Y2); m_Color = Color; } void CCircleFill::Draw (CDC *PDC) { CBrush Brush, *POldBrush; CPen Pen, *POldPen; // select pen/brush: Pen.CreatePen (PS_INSIDEFRAME, 1, m_Color); POldPen = PDC->SelectObject (&Pen); Brush.CreateSolidBrush (m_Color); POldBrush = PDC->SelectObject (&Brush); // draw figure: PDC->Ellipse (m_X1, m_Y1, m_X2, m_Y2); // remove pen/brush: PDC->SelectObject (POldPen); PDC->SelectObject (POldBrush); }
要实现QML中Drag和Drop模式同样的操作,可以使用Qt中的QDrag和QDropEvent类来处理。具体步骤如下: 1. 在源控件(B控件)中,实现mousePressEvent和mouseMoveEvent事件,用QDrag创建一个拖动对象,并将其MIME数据设置为要传递的数据。 2. 在目标控件(A控件)中,实现dragEnterEvent、dragMoveEvent和dropEvent事件。在dragEnterEvent和dragMoveEvent事件中,使用QDropEvent的acceptProposedAction方法接受拖动操作。在dropEvent事件中,使用QDropEvent的mimeData方法获取传递的数据。 以下是C++代码示例: 在源控件(B控件)中: ``` void MyWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; // 设置MIME数据 mimeData->setText("Hello World"); drag->setMimeData(mimeData); drag->exec(Qt::CopyAction); } } void MyWidget::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { // 开始拖动操作 QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; // 设置MIME数据 mimeData->setText("Hello World"); drag->setMimeData(mimeData); drag->exec(Qt::CopyAction); } } ``` 在目标控件(A控件)中: ``` void MyWidget::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasText()) { event->acceptProposedAction(); } } void MyWidget::dragMoveEvent(QDragMoveEvent *event) { if (event->mimeData()->hasText()) { event->acceptProposedAction(); } } void MyWidget::dropEvent(QDropEvent *event) { if (event->mimeData()->hasText()) { QString text = event->mimeData()->text(); // 处理传递的数据 event->acceptProposedAction(); } } ``` 以上就是在C++中实现QML中Drag和Drop模式同样的操作的方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值