【C++】QT学习的小练习编程


集成开发环境:QT creator

完整程序资源免费下载:
【C++】QT小练习代码

一、QT入门与基础控件练习

1、入门练习

实现效果
在这里插入图片描述
程序结构
在这里插入图片描述

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QLineEdit>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public slots:
    void movestr()
    {
        le1->setText(le->text());
    }

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    QPushButton *pb;
    QLineEdit *le;
    QLineEdit *le1;
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include "ui_widget.h"
#include <QVBoxLayout>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    pb = new QPushButton("OK", this);
    le = new QLineEdit(this);
    le1 = new QLineEdit(this);

    //pb->setGeometry(0, 100, 100, 50);
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(le);
    vbox->addWidget(le1);
    vbox->addWidget(pb);

    this->setLayout(vbox);

    //connect(pb, SIGNAL(clicked(bool)),le,SLOT(clear()));
    connect(pb, SIGNAL(clicked(bool)),this,SLOT(movestr()));

    ui->setupUi(this);
}

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

2、布局管理器

目的:观察不同布局的效果

程序结构

在这里插入图片描述

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLineEdit>
#include <QPushButton>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

private:
    QLineEdit *le, *le1;
    QPushButton *pb;
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QFormLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    le = new QLineEdit(this);
    le1 = new QLineEdit(this);
    pb = new QPushButton("ok", this);

#if 0
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(le);
    vbox->addWidget(le1);
    vbox->addWidget(pb);

    this->setLayout(vbox);
#endif
#if 0
    QHBoxLayout *hbox = new QHBoxLayout;
    hbox->addWidget(le);
    hbox->addWidget(le1);
    hbox->addWidget(pb);

    this->setLayout(hbox);
#endif
#if 0
    QGridLayout *gbox = new QGridLayout;
    gbox->addWidget(le, 0, 0);
    gbox->addWidget(le1, 1, 1);
    gbox->addWidget(pb, 2, 2);

    this->setLayout(gbox);
#endif
    QFormLayout *fbox = new QFormLayout;
    fbox->addRow("user", le);
    fbox->addRow("pawd", le1);
    fbox->addRow("", pb);

    this->setLayout(fbox);
}

Widget::~Widget()
{

}


3、输入与输出控件

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

程序结构
在这里插入图片描述

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

#include <QLineEdit>
#include <QTextEdit>
#include <QComboBox>
#include <QTimeEdit>
#include <QDial>
#include <QSlider>
#include <QScrollBar>

#include <QLabel>
#include <QLCDNumber>
#include <QProgressBar>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

private:
    //input
    QLineEdit *le;
    QTextEdit *te;
    QComboBox *cb;
    QTimeEdit *timee;
    QDial *dl;
    QSlider *sd;
    QScrollBar *sb;

    //output
    QLabel *lb;
    QLabel *lb1;
    QLCDNumber *lcd;
    QProgressBar *pgb;

};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //input
    le = new QLineEdit(this);
    te = new QTextEdit;
    cb = new QComboBox;
    cb->addItem("read");
    cb->addItem("write");
    timee = new QTimeEdit;
    dl = new QDial ;
    sd = new QSlider;
    sd->setOrientation(Qt::Horizontal);
    sb = new QScrollBar;
    sb->setOrientation(Qt::Horizontal);
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(le);
    vbox->addWidget(te);
    vbox->addWidget(cb);
    vbox->addWidget(timee);
    vbox->addWidget(dl);
    vbox->addWidget(sd);
    vbox->addWidget(sb);

    //output
    lb = new QLabel("hello");
    lb1 = new QLabel;
    lcd = new QLCDNumber;
    pgb = new QProgressBar;
    QPixmap pix("1.png");  //自己找张图片放在项目生成的“build...”目录下
    lb1->setFixedSize(100, 100);
    lb1->setScaledContents(true);  //图片大小自适应
    lb1->setPixmap(pix);
    QVBoxLayout *vbox1 = new QVBoxLayout;
    vbox1->addWidget(lb);
    vbox1->addWidget(lb1);
    vbox1->addWidget(lcd);
    vbox1->addWidget(pgb);

    QHBoxLayout *hbox = new QHBoxLayout;
    hbox->addLayout(vbox);
    hbox->addLayout(vbox1);

    this->setLayout(hbox);

    connect(dl, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));
    connect(dl, SIGNAL(valueChanged(int)), pgb, SLOT(setValue(int)));
    connect(sd, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));
    connect(sd, SIGNAL(valueChanged(int)), pgb, SLOT(setValue(int)));

}

Widget::~Widget()
{

}

4、按键

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

程序结构

在这里插入图片描述

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLineEdit>
#include <QPushButton>
#include <QCheckBox>

class Widget : public QWidget
{
    Q_OBJECT
public slots:
    void show_passwd(bool show_flag) //根据传递的bool值决定是否显示密码
    {
        if(show_flag)
            le->setEchoMode(QLineEdit::Normal);
        else
            le->setEchoMode(QLineEdit::Password);
    }

public:
    Widget(QWidget *parent = 0);
    ~Widget();
private:
    QLineEdit *le;
    QCheckBox *ck;  //决定密码是否显示
    QPushButton *pb;

};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include <QVBoxLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    le = new QLineEdit;
    le->setEchoMode(QLineEdit::Password);  //密码显示
    ck = new QCheckBox("show passward");
    pb = new QPushButton("clear");

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(le);
    vbox->addWidget(ck);
    vbox->addWidget(pb);
    this->setLayout(vbox);

    connect(pb, SIGNAL(clicked(bool)), le, SLOT(clear()));
    connect(ck, SIGNAL(clicked(bool)), this, SLOT(show_passwd(bool)));
}

Widget::~Widget()
{

}

6、容器

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

程序结构
在这里插入图片描述

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QGroupBox>
#include <QRadioButton>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

private:
    QGroupBox *gb;

    QRadioButton *r1, *r2, *r3;  //单选按钮
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include <QVBoxLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    gb = new QGroupBox("choice", this);

    r1 = new QRadioButton("aaaa");
    r2 = new QRadioButton("bbbb");
    r3 = new QRadioButton("cccc");

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(r1);
    vbox->addWidget(r2);
    vbox->addWidget(r3);

    gb->setLayout(vbox);

    QVBoxLayout *mainbox = new QVBoxLayout;
    mainbox->addWidget(gb);
    this->setLayout(mainbox);

}

Widget::~Widget()
{

}

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

程序结构
在这里插入图片描述

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QScrollArea>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
private:
    QLabel *lb;
    QScrollArea *sa;
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include <QVBoxLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    lb = new QLabel;
    QPixmap pix("1.png");  //自行找图片添加在项目运行时生成的“bulid...”目录下
    lb->setPixmap(pix);

    sa = new QScrollArea;
    sa->setWidget(lb);

    QVBoxLayout *mainbox = new QVBoxLayout;
    mainbox->addWidget(sa);
    this->setLayout(mainbox);
}

Widget::~Widget()
{

}

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

程序结构
在这里插入图片描述

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QToolBox>
#include <QPushButton>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
private:
    QToolBox *tb;

    QPushButton *pb[3];
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include <QVBoxLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    tb = new QToolBox;

    pb[0] = new QPushButton("aaa");
    pb[1] = new QPushButton("bbb");
    pb[2] = new QPushButton("ccc");

    tb->addItem(pb[0], "11111");
    tb->addItem(pb[1], "22222");
    tb->addItem(pb[2], "33333");

    QVBoxLayout *mainbox = new QVBoxLayout;
    mainbox->addWidget(tb);
    this->setLayout(mainbox);
}

Widget::~Widget()
{

}

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

程序结构
在这里插入图片描述

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTabWidget>
#include <QTextEdit>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
private:
    QTabWidget *tw;

    QTextEdit *te1, *te2, *te3;
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include <QVBoxLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    tw = new QTabWidget;

    te1 = new QTextEdit("11111");
    te2 = new QTextEdit("22222");
    te3 = new QTextEdit("33333");

    tw->addTab(te1, "1.c");
    tw->addTab(te2, "2.c");
    tw->addTab(te3, "3.c");

    QVBoxLayout *mainbox = new QVBoxLayout;
    mainbox->addWidget(tw);
    this->setLayout(mainbox);
}

Widget::~Widget()
{

}

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

程序结构
在这里插入图片描述

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QStackedWidget>
#include <QTextEdit>
#include <QcomboBox>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
private:
    QStackedWidget *sw;

    QTextEdit *te1, *te2, *te3;

    QComboBox *cb;
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include <QVBoxLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    sw = new QStackedWidget;

    te1 = new QTextEdit("111");
    te2 = new QTextEdit("222");
    te3 = new QTextEdit("333");

    sw->addWidget(te1);
    sw->addWidget(te2);
    sw->addWidget(te3);

    cb = new QComboBox;
    cb->addItem("1111");
    cb->addItem("2222");
    cb->addItem("3333");

    QVBoxLayout *mainbox = new QVBoxLayout;
    mainbox->addWidget(sw);
    mainbox->addWidget(cb);
    this->setLayout(mainbox);

    connect(cb, SIGNAL(activated(int)), sw, SLOT(setCurrentIndex(int)));
}

Widget::~Widget()
{

}

二、对话框练习

1、标准对话框

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

程序结构

在这里插入图片描述

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QColorDialog>
#include <QErrorMessage>
#include <QFileDialog>
#include <QFontDialog>
#include <QInputDialog>
#include <QMessageBox>
#include <QProgressDialog>

#include <QPushButton>
#include <QTextEdit>
#include <QDebug>

class Widget : public QWidget
{
    Q_OBJECT

public slots:
    void setcolor()
    {
        QColor c = QColorDialog::getColor();
        te->setTextColor(c);
    }
    void showerr()
    {
        QErrorMessage *msg = QErrorMessage::qtHandler();
        msg->showMessage("error!");
    }
    void getfile()
    {
        QString filename = QFileDialog::getOpenFileName();

        qDebug()<<filename;
        te->setText(filename);
    }
    void setfont()
    {
        bool ok;
        QFont myfont = QFontDialog::getFont(&ok);
        if(ok)
            te->setFont(myfont);
    }
    void getstr()
    {
        QString str = QInputDialog::getText(this, "xxxx", "yyyy");
        te->setText(str);
    }
    void showmsg()
    {
        QMessageBox::information(this,"xxxx", "hello", "AAA");
    }
    void showprogress()
    {
        QProgressDialog p;
        p.setValue(50);
        p.exec();
    }

public:
    Widget(QWidget *parent = 0);
    ~Widget();
private:
    QPushButton *btColor;
    QPushButton *bterrm;
    QPushButton *btfile;
    QPushButton *btfont;
    QPushButton *btinput;
    QPushButton *btmsg;
    QPushButton *btprg;

    QTextEdit *te;
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    btColor = new QPushButton("setcolor");
    bterrm = new QPushButton("errmsg");
    btfile = new QPushButton("getfile");
    btfont = new QPushButton("setfont");
    btinput = new QPushButton("getstr");
    btmsg = new QPushButton("msg");
    btprg = new QPushButton("progress");

    te = new QTextEdit;

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(btColor);
    vbox->addWidget(bterrm);
    vbox->addWidget(btfile);
    vbox->addWidget(btfont);
    vbox->addWidget(btinput);
    vbox->addWidget(btmsg);
    vbox->addWidget(btprg);

    QHBoxLayout *hbox = new QHBoxLayout;
    hbox->addLayout(vbox);
    hbox->addWidget(te);

    this->setLayout(hbox);

    connect(btColor, SIGNAL(clicked(bool)), this, SLOT(setcolor()));
    connect(bterrm, SIGNAL(clicked(bool)), this, SLOT(showerr()));
    connect(btfile, SIGNAL(clicked(bool)), this, SLOT(getfile()));
    connect(btfont, SIGNAL(clicked(bool)), this, SLOT(setfont()));
    connect(btinput, SIGNAL(clicked(bool)), this, SLOT(getstr()));
    connect(btmsg, SIGNAL(clicked(bool)), this, SLOT(showmsg()));
    connect(btprg, SIGNAL(clicked(bool)), this, SLOT(showprogress()));

}

Widget::~Widget()
{

}

2、自定义对话框

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

程序结构
在这里插入图片描述

myqdialog.h:

#ifndef MYQDIALOG_H
#define MYQDIALOG_H

#include <QDialog>
#include <QLineEdit>
#include <QPushButton>
#include <QMessageBox>
#include <QCheckBox>

/* 登录界面类 */
class myQDialog : public QDialog
{
    Q_OBJECT
public slots:
    void ok_pushed()
    {
        if(username->text() == "root" && passward->text() == "123456") //判断账号与密码是否正确
        {
            stat = true;
            QMessageBox::information(this,"登录", "登录成功", "确定");
            close();
        }
        else
        {
            QMessageBox::information(this,"登录", "密码或者账号错误", "确定");
        }
    }
    void show_passward(bool show_passward_flag)  //密码是否显示
    {
        if(show_passward_flag)
            passward->setEchoMode(QLineEdit::Normal);
        else
            passward->setEchoMode(QLineEdit::Password);
    }

public:
    myQDialog();
    static int getstat()  //创建登录窗口
    {
        myQDialog a;

        a.exec();

        return a.stat;
    }

private:
    QLineEdit *username;
    QLineEdit *passward;
    QPushButton *pb;
    QCheckBox *ck;

    int stat = false;  //ture:点击了登录按键并且账号与密码正确,跳转界面,false:没有点击登录按键或者账号与密码不正确
};

#endif // MYQDIALOG_H

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "myqdialog.h"

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
};

#endif // WIDGET_H

myqdialog.cpp:

#include "myqdialog.h"
#include <QFormLayout>

myQDialog::myQDialog()
{
    /* 创建各个控件空间 */
    username = new QLineEdit;
    passward = new QLineEdit;
    passward->setEchoMode(QLineEdit::Password);
    ck = new QCheckBox("show passward");
    pb = new QPushButton("登录");

    /* 各控件排列 */
    QFormLayout *fbox = new QFormLayout;
    fbox->addRow("username", username);
    fbox->addRow("passward", passward);
    fbox->addWidget(ck);
    fbox->addWidget(pb);

    /* 显示 */
    this->setLayout(fbox);

    /* 控件功能 */
    connect(pb, SIGNAL(clicked(bool)), this, SLOT(ok_pushed()));
    connect(ck, SIGNAL(clicked(bool)), this, SLOT(show_passward(bool)));
}

widget.cpp:

#include "widget.h"
#include "myqdialog.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
   int s = myQDialog::getstat();

   if(!s)
       exit(0);
}

Widget::~Widget()
{

}

三、主窗口和事件处理

1、action、菜单栏、工具栏、菜单栏

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

程序结构
在这里插入图片描述

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QAction>
#include <QTextEdit>
#include <QLabel>
#include <QFileDialog>
#include <QColorDialog>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public slots:
    void openf()
    {
        QString filename = QFileDialog::getOpenFileName();
        te->setText(filename);
    }
    void copyf()
    {
        te->copy();
    }
    void pastf()
    {
        te->paste();
    }

    void setcf()
    {
        QColor ccc = QColorDialog::getColor();
        te->setTextColor(ccc);
    }

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    QAction *openfileact;

    QAction *copyfileact, *pastfileact;

    QAction *setcoloract;

    //central
    QTextEdit *te;

    //status
    QLabel *slb;

};

#endif // MAINWINDOW_H

mainwindow.cpp:

#include "mainwindow.h"
#include <QMenu>
#include <QMenuBar>
#include <QToolBar>
#include <QStatusBar>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //create actions
    openfileact = new QAction(QIcon("open.png"),"open");
    openfileact->setShortcut(QKeySequence(tr("Ctrl+o")));
    copyfileact = new QAction(QIcon("copy.png"),"copy");
    pastfileact = new QAction(QIcon("past.png"),"past");
    setcoloract = new QAction(QIcon("color.png"),"setcolor");

    //create meu
    QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
    fileMenu->addAction(openfileact);

    QMenu *editMenu = menuBar()->addMenu(tr("&Edit"));
    editMenu->addAction(copyfileact);
    editMenu->addAction(pastfileact);

    QMenu *setMenu = menuBar()->addMenu(tr("&Set"));
    setMenu->addAction(setcoloract);

    //create tool
    QToolBar *file = addToolBar("file");
    file->addAction(openfileact);
    QToolBar *tedit = addToolBar("edit");
    tedit->addAction(copyfileact);
    tedit->addAction(pastfileact);
    QToolBar *tset = addToolBar("set");
    tset->addAction(setcoloract);

    //cenctrol
    te = new QTextEdit();
    te->setMinimumSize(640, 480);
    setCentralWidget(te);  //将编辑框增加到window当中

    //statures
    slb = new QLabel("1.txt");
    QStatusBar *stb = statusBar();
    stb->addWidget(slb);

    connect(openfileact, SIGNAL(triggered(bool)), this, SLOT(openf()));
    connect(copyfileact, SIGNAL(triggered(bool)), this, SLOT(copyf()));
    connect(pastfileact, SIGNAL(triggered(bool)), this, SLOT(pastf()));
    connect(setcoloract, SIGNAL(triggered(bool)), this, SLOT(setcf()));
}

MainWindow::~MainWindow()
{

}

2、事件

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

程序结构
在这里插入图片描述

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QMouseEvent>
#include <QWheelEvent>
#include <QTimerEvent>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

    void mousePressEvent(QMouseEvent *event)  //鼠标点击事件
    {
        qDebug() << "pressssss:" << event->pos();
    }

    void mouseMoveEvent(QMouseEvent *event)  //鼠标移动事件
    {
        qDebug() << "moving:" << event->pos();
    }

    void keyPressEvent(QKeyEvent *event)   //键盘按下事件
    {
        qDebug() << "key: " << event->key();
    }

    void wheelEvent(QWheelEvent *event)  //鼠标滚轮事件
    {
        qDebug() << "wheel: " << event->delta();
    }

    void timerEvent(QTimerEvent *event)  //定时器事件
    {
        qDebug()<<"timer!";
    }
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    startTimer(1000);
}

Widget::~Widget()
{

}

3、绘图事件

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

程序结构
在这里插入图片描述

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QPainter>
#include <QTimerEvent>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

    void paintEvent(QPaintEvent *event)
    {
        QPainter p(this);

        p.translate(this->width()/2, this->height()/2);
        p.drawEllipse(QPoint(0, 0), 100, 100);
        p.rotate((i++)*10);
        p.drawLine(0, 0, 50, 50);
    }

    void timerEvent(QTimerEvent *event)
    {
        update();
    }

private:
    int i = 0;
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    startTimer(1000);
}

Widget::~Widget()
{

}


4、绘图板

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

程序结构
在这里插入图片描述

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMouseEvent>
#include <QPainter>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

    void mousePressEvent(QMouseEvent *event)
    {
        startp = event->pos();
    }

    void mouseReleaseEvent(QMouseEvent *event)
    {
        saveit = true;
        update();
    }

    void mouseMoveEvent(QMouseEvent *event)
    {
        endp = event->pos();
        update();
    }

    void paintEvent(QPaintEvent *event)
    {
        if(saveit)
        {
            QPainter px(pix);
            px.drawLine(startp, endp);
            saveit = false;
        }
            QPainter p(this);
            p.drawPixmap(0, 0, *pix);
            p.drawLine(startp, endp);
     }

private:
    QPoint startp;
    QPoint endp;
    QPixmap *pix;

    bool saveit = false;
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    pix = new QPixmap(this->width(), this->height());
    pix->fill();
}

Widget::~Widget()
{

}

5、事件过滤

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

程序结构
在这里插入图片描述

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QFileDialog>
#include <QStringList>
#include <QEvent>
#include <QKeyEvent>

class Widget : public QWidget
{
    Q_OBJECT
public slots:
    void openfiles()
    {
        index = 0;
        files = QFileDialog::getOpenFileNames();
        QPixmap pix(files[index]);
        lb->setPixmap(pix);
    }

    void showr()   //显示向右的下一张图片
    {
        if(index + 1 < files.length())
        {
            QPixmap pix(files[++index]);
            lb->setPixmap(pix);
        }
        else
        {
            index = 0;
            QPixmap pix(files[index]);
            lb->setPixmap(pix);
        }
    }

    void showl()   //显示向左的下一张图片
    {
        if(index > 0 )
        {
            QPixmap pix(files[--index]);
            lb->setPixmap(pix);
        }
        else
        {
            index = files.length()-1;
            QPixmap pix(files[index]);
            lb->setPixmap(pix);
        }
    }
    bool eventFilter(QObject *watched, QEvent *event)  //事件过滤函数
    {
        lb->setFocus();
        if(watched == lb)
        {
            if(event->type() == QEvent::KeyPress)
            {
                QKeyEvent *keyevent = static_cast<QKeyEvent*>(event);
                if(keyevent->key() == Qt::Key_Left)  //l 按键"<"
                    showl();
                else if(keyevent->key() == Qt::Key_Right)  //r  //按键">"
                    showr();
                return true;
            }
        }
        return QWidget::eventFilter(watched, event);
    }

public:
    Widget(QWidget *parent = 0);
    ~Widget();
private:
    QLabel *lb;
    QPushButton *lbt, *rbt, *openbt;

    QStringList files;

    int index;
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    lb = new QLabel;
    lb->setMinimumSize(640, 480);
    lb->setScaledContents(true);  //大小自适应
    lb->setFocus();
    lb->installEventFilter(this);

    lbt = new QPushButton("<");
    rbt = new QPushButton(">");
    openbt = new QPushButton("open");

    QHBoxLayout *hbox = new QHBoxLayout;
    hbox->addStretch();  //按键集中
    hbox->addWidget(lbt);
    hbox->addWidget(openbt);
    hbox->addWidget(rbt);
    hbox->addStretch();

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(lb);
    vbox->addLayout(hbox);

    setLayout(vbox);

    connect(openbt, SIGNAL(clicked(bool)), this, SLOT(openfiles()));
    connect(rbt, SIGNAL(clicked(bool)), this, SLOT(showr()));
    connect(lbt, SIGNAL(clicked(bool)), this, SLOT(showl()));
}

Widget::~Widget()
{

}

四、文件与进程、线程

1、文件

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

程序结构
在这里插入图片描述

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTextEdit>
#include <QLineEdit>
#include <QPushButton>
#include <QFileDialog>
#include <Qfile>
#include <QTextStream>

class Widget : public QWidget
{
    Q_OBJECT
public slots:
    void showfile()
    {
        QString filename = QFileDialog::getOpenFileName();
        le->setText(filename);

        QFile file(filename);  //读取文件内容并打印在编辑框里
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
            return;

        while (!file.atEnd()) {
            QByteArray line = file.readLine();
            //process_line(line);
            te->append(line);
        }

    }

public:
    Widget(QWidget *parent = 0);
    ~Widget();
private:
    QTextEdit *te;
    QLineEdit *le;
    QPushButton *pb;

};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include <QVBoxLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    te = new QTextEdit;
    te->setMinimumSize(640, 480);
    le = new QLineEdit;
    pb = new QPushButton("open");

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(te);
    vbox->addWidget(le);
    vbox->addWidget(pb);

    setLayout(vbox);

    connect(pb, SIGNAL(clicked(bool)), this, SLOT(showfile()));
}

Widget::~Widget()
{

}

2、文件目录

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

程序结构

在这里插入图片描述

main.cpp:

#include <QCoreApplication>
#include <QDir>
#include <iostream>
#include <QFileInfo>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QDir dir;

    QFileInfoList list = dir.entryInfoList();  //得到文件夹下的文件列表
    std::cout << "     Bytes Filename" << std::endl;
    for (int i = 0; i < list.size(); ++i) {  //遍历文件夹下的文件
        QFileInfo fileInfo = list.at(i);
        std::cout << fileInfo.size() << "\t" <<fileInfo.fileName().toStdString().c_str();  //打印文件大小与文件名
        std::cout << std::endl;
    }

    return a.exec();
}

3、进程

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

程序结构
在这里插入图片描述

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLineEdit>
#include <QPushButton>
#include <QFileDialog>
#include <QProcess>
#include <QStringList>

class Widget : public QWidget
{
    Q_OBJECT
public slots:
    void showfile()
    {
        QString filename = QFileDialog::getOpenFileName();
        le->setText(filename);  //得到文件名

        QStringList arg = {filename};
        QProcess ppp;
        ppp.execute("notepad", arg);  //启动txt阅读器
    }

public:
    Widget(QWidget *parent = 0);
    ~Widget();
private:
    QLineEdit *le;
    QPushButton *pb;
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include <QVBoxLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    le = new QLineEdit;
    pb = new QPushButton("showtxt");

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(le);
    vbox->addWidget(pb);
    setLayout(vbox);

    connect(pb, SIGNAL(clicked(bool)), this, SLOT(showfile()));

}

Widget::~Widget()
{

}

4、线程

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

程序结构
在这里插入图片描述

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QProgressBar>
#include "mythread.h"
#include "mythread1.h"

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
private:
    QProgressBar *p1, *p2;

    mythread *t1;
    mythread1 *t2;
};

#endif // WIDGET_H

mythread.h:

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>

class mythread : public QThread
{
    Q_OBJECT
signals:
    downloaded(int);
public:
    mythread();

    void run()
    {
        for(int i=0;i < 100;++i)
        {
            emit downloaded(i);
            QThread::sleep(1);
        }
    }
};

#endif // MYTHREAD_H

mythread1.h:

#ifndef MYTHREAD1_H
#define MYTHREAD1_H

#include <QThread>

class mythread1 : public QThread
{
    Q_OBJECT
signals:
    downloaded(int);
public:
    mythread1();

    void run()
    {
        for(int i=0;i < 100;++i)
        {
            emit downloaded(i);
            QThread::sleep(2);
        }
    }
};

#endif // MYTHREAD1_H

widget.cpp:

#include "widget.h"
#include <QVBoxLayout>
#include <QThread>


Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    p1 = new QProgressBar;
    p2 = new QProgressBar;

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(p1);
    vbox->addWidget(p2);
    setLayout(vbox);

    t1 = new mythread;
    t2 = new mythread1;

    connect(t1, SIGNAL(downloaded(int)), p1, SLOT(setValue(int)));
    connect(t2, SIGNAL(downloaded(int)), p2, SLOT(setValue(int)));

    t1->start();
    t2->start();
}

Widget::~Widget()
{

}

5、线程同步

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

程序结构
在这里插入图片描述

hello.h:

#ifndef HELLO_H
#define HELLO_H

#include <QThread>
#include <QDebug>
#include <QSemaphore>

class hello : public QThread
{
    Q_OBJECT
public:
    hello(QSemaphore *sem);

    void run()
    {
        while(1)
        {
            qDebug() << "hello";
            QThread::sleep(1);

            //v
            this->sem->release(1);

        }
    }
private:
    QSemaphore *sem;
};

#endif // HELLO_H

world.h:

#ifndef WORLD_H
#define WORLD_H

#include <QThread>
#include <QDebug>
#include <QSemaphore>

class world : public QThread
{
    Q_OBJECT
public:
    world(QSemaphore *sem);

    void run()
    {
        while(1)
        {
            //p
            this->sem->acquire(1);

            qDebug() << "world";

        }
    }
private:
    QSemaphore *sem;
};

#endif // WORLD_H

main.cpp:

#include <QCoreApplication>
#include "hello.h"
#include "world.h"
#include <QSemaphore>

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

    QSemaphore sem;
    hello hello(&sem);
    world world(&sem);

    hello.start();
    world.start();

    return a.exec();
}

6、互斥

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

程序结构
在这里插入图片描述

thread_rev.h:

#ifndef THREAD_REV_H
#define THREAD_REV_H

#include <QThread>
#include <QDebug>
#include <QMutex>

class thread_rev : public QThread
{
    Q_OBJECT
public:
    thread_rev(char *p, QMutex *lock):arr(p), arr_lock(lock){}

    void run()
    {
        while(1)
        {
            arr_lock->lock();

            for(int i=0;i < 5;++i)
            {
                arr[i] ^= arr[9-i];
                arr[9-i] ^= arr[i];
                arr[i] ^= arr[9-i];
            }

            arr_lock->unlock();
        }
    }

private:
    char *arr;

    QMutex *arr_lock;
};

#endif // THREAD_REV_H

threadshow.h:

#ifndef THREADSHOW_H
#define THREADSHOW_H

#include <QThread>
#include <QDebug>
#include <QMutex>

class threadshow : public QThread
{
    Q_OBJECT
public:
    threadshow(char *p, QMutex *lock):arr(p), arr_lock(lock){}

    void run()
    {
        while(1)
        {
            arr_lock->lock();

            qDebug() << arr;

            arr_lock->unlock();
        }
    }

private:
    char *arr;

    QMutex *arr_lock;
};

#endif // THREADSHOW_H

main.cpp:

#include <QCoreApplication>
#include "threadshow.h"
#include "thread_rev.h"
#include <QMutex>

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

    char arr[] = "0123456789";
    QMutex arr_lock;
    threadshow t1(arr, &arr_lock);
    thread_rev t2(arr, &arr_lock);

    t1.start();
    t2.start();

    return a.exec();
}

五、网络编程

1、UDP编程

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

客户端:

程序结构
在这里插入图片描述

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTextEdit>
#include <QLineEdit>
#include <QPushButton>
#include <QUdpSocket>
#include <QHostAddress>

class Widget : public QWidget
{
    Q_OBJECT
public slots:
    void senddata()
    {
        udpsock->writeDatagram(le->text().toStdString().c_str(), QHostAddress("192.168.43.120"), 8888);
    }

    void recvdata()
    {
        QByteArray datagram;
        datagram.resize(udpsock->pendingDatagramSize());
        QHostAddress sender;
        quint16 senderPort;

        udpsock->readDatagram(datagram.data(), datagram.size(),
                                         &sender, &senderPort);
        te->append(datagram);
    }

public:
    Widget(QWidget *parent = 0);
    ~Widget();
private:
    QTextEdit *te;
    QLineEdit *le;
    QPushButton *pb;

    QUdpSocket *udpsock;
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include <QVBoxLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    te = new QTextEdit;
    le =new QLineEdit;
    pb = new QPushButton("send");

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(te);
    vbox->addWidget(le);
    vbox->addWidget(pb);

    setLayout(vbox);

    udpsock = new QUdpSocket;

    connect(pb, SIGNAL(clicked(bool)), this, SLOT(senddata()));
    connect(udpsock, SIGNAL(readyRead()), this, SLOT(recvdata()));
}

Widget::~Widget()
{

}

额外添加
在这里插入图片描述


服务器:

程序结构

在这里插入图片描述

udp_Server.h:

#ifndef UDP_SERVER_H
#define UDP_SERVER_H

#include <QObject>
#include <QUdpSocket>
#include <QDebug>

class udp_Server : public QObject
{
    Q_OBJECT
public:
    explicit udp_Server(QObject *parent = 0);
    void init()
    {
        udpsock = new QUdpSocket(this);
        udpsock->bind(QHostAddress::AnyIPv4, 8888);

        connect(udpsock, SIGNAL(readyRead()),
            this, SLOT(readPendingDatagrams()));

        qDebug() << "init ok....";
    }

signals:

public slots:
    void readPendingDatagrams()
    {
        while (udpsock->hasPendingDatagrams()) {
            QByteArray datagram;
            datagram.resize(udpsock->pendingDatagramSize());
            QHostAddress sender;
            quint16 senderPort;

            udpsock->readDatagram(datagram.data(), datagram.size(),
                &sender, &senderPort);

            qDebug() << "recv:" << datagram;
            //processTheDatagram(datagram);

            udpsock->writeDatagram(datagram.data(), datagram.size(),
                sender, senderPort);
        }
    }

private:
    QUdpSocket *udpsock;
};

#endif // UDP_SERVER_H

main.cpp:

#include <QCoreApplication>
#include "udp_server.h"

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

    udp_Server server;
    server.init();

    return a.exec();
}

2、TCP编程

客户端:
程序结构:
在这里插入图片描述
widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTextEdit>
#include <QLineEdit>
#include <QPushButton>
#include <QTcpSocket>

class Widget : public QWidget
{
    Q_OBJECT
public slots:
    void senddata()
    {
        tcpsock->write(le->text().toStdString().c_str());
    }

    void recvdata()
    {
        QByteArray buf = tcpsock->readAll();
        te->append(buf);
    }

public:
    Widget(QWidget *parent = 0);
    ~Widget();
private:
    QTextEdit *te;
    QLineEdit *le;
    QPushButton *pb;

    QTcpSocket *tcpsock;
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include <QVBoxLayout>
#include <QHostAddress>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    te = new QTextEdit;
    le = new QLineEdit;
    pb = new QPushButton("send");

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(te);
    vbox->addWidget(le);
    vbox->addWidget(pb);

    setLayout(vbox);

    tcpsock = new QTcpSocket;
    //connect to server
    tcpsock->connectToHost(QHostAddress("192.168.43.120"), 8887);
    connect(pb, SIGNAL(clicked(bool)), this, SLOT(senddata()));
    connect(tcpsock, SIGNAL(readyRead()), this, SLOT(recvdata()));
}

Widget::~Widget()
{

}

服务器:
tcpServer.h:

#ifndef TCPSERVER_H
#define TCPSERVER_H

#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>

class tcpServer : public QObject
{
    Q_OBJECT
public:
    explicit tcpServer(QObject *parent = 0);

signals:

public slots:
    void newconnected()
    {
        qDebug() << "connected new....";
        clientsock = ser->nextPendingConnection();

        connect(clientsock, SIGNAL(readyRead()), this, SLOT(readdata()));
    }
    void readdata()
    {
        QByteArray buf = clientsock->readAll();
        qDebug() << "recv:" << buf;
        clientsock->write(buf);
    }

private:
    QTcpServer *ser;
    QTcpSocket *clientsock;
};

#endif // TCPSERVER_H

tcpServer.cpp:

#include "tcpserver.h"
#include <QHostAddress>

tcpServer::tcpServer(QObject *parent) : QObject(parent)
{
    ser = new QTcpServer;
    ser->listen(QHostAddress::AnyIPv4, 8887);
    connect(ser, SIGNAL(newConnection()), this, SLOT(newconnected()));

    ser->waitForNewConnection();
}

main.cpp:

#include <QCoreApplication>
#include <tcpserver.h>

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

    tcpServer *server;

    return a.exec();
}

### 回答1: 可以使用以下代码将quint8转换为quint32: ``` quint8 value8 = 123; quint32 value32 = value8; ``` 此代码将`value8`的值(123)复制到`value32`中。请注意,此操作将自动将`quint8`类型转换为`quint32`类型。 ### 回答2: quint8转换为quint32,可以简单地理解为将一个占用8位的无符号整数转换为占用32位的无符号整数。 在Qt中,quint8和quint32是两种不同的整数类型,其取值范围也不同。quint8的取值范围是0到255,占用一个字节的存储空间;而quint32的取值范围是0到4294967295,占用四个字节的存储空间。所以,在进行quint8到quint32的转换时,需要考虑溢出和数据截断的问题。 将quint8转换为quint32可以使用隐式转换或显式转换。隐式转换是指在赋值或传参时,将quint8的值直接赋给quint32。这样的转换过程可以隐式地完成,不需要显式地调用任何函数。 例如:quint8 value1 = 255; quint32 value2 = value1; 通过以上代码,将quint8变量value1的值255赋给了quint32变量value2,此处的转换是隐式的。 显式转换是指使用类型转换运算符(static_cast)或者调用相应的转换函数(例如quint32(quint8))来完成类型转换。这种方式可以显式地指明要进行的转换,可以提高代码的可读性。 例如:quint8 value1 = 255; quint32 value2 = static_cast<quint32>(value1); 通过以上代码,使用static_cast显式地将quint8类型的变量value1转换为quint32类型的变量value2。 需要注意的是,在进行quint8到quint32的转换时,由于quint32的取值范围较大,虽然在这个转换中不会导致溢出或数据截断的问题,但在其他类型的数据转换中,我们应该谨慎处理数据范围的合理性,以避免潜在的错误。 ### 回答3: quint8和quint32是Qt编程语言中的两种数据类型,其中quint8表示一个无符号8位整数,而quint32表示一个无符号32位整数。 要将quint8转换为quint32,可以通过使用静态方法fromValue()来实现。该方法接受一个quint8类型的值作为参数,并返回对应的quint32类型的值。示例如下: quint8 value8 = 100; // 假设有一个quint8类型的变量value8,其值为100 quint32 value32 = quint32::fromValue(value8); // 将value8转换为quint32类型 上述代码中,我们通过调用fromValue()方法并传入value8变量作为参数,将其转换为quint32类型,并将结果赋值给value32变量。 转换后的value32变量将包含与原始value8变量相同的值,但数据类型变为quint32。 需要注意的是,quint8和quint32的转换可能导致数据溢出,因为quint8只能表示0到255之间的整数,而quint32可以表示更大的整数范围。所以在进行类型转换之前,需要确保转换后的值不会超出quint32的表示范围,以避免数据丢失。 这就是将quint8转换为quint32的简单介绍,希望对您有帮助!
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修成真

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值