QT教程

QT框架——C++语言

#include
#include
int main(int argc,char *argv[]){
    QApplication app(argc,argv);
    //添加程序
    return app.exec();
}
  • QObject:所有能够处理Signal、slot和事件的Qt对象的基类
  • QApplication:对于一个应用程序是必类实体化是必须的,是QObject的子类
  • QWidget:是所有用户接口对象的基类,它继承了QObject类的属性。用户接口对象也称组件——QDialog、QMainWindow、QFrame直接继承QWidget类

image-20220618002737772

Qt中采用信号和槽来实现通信

QT创建工程

  • Empty Qt4 Project
    • 只创建“工程名.pro”的工程文件
    • 需要手动创建,编辑输入纯源码程序

image-20220618004242541

image-20220618004258306

image-20220618004320611

image-20220618011942298

  • Qt4 Gui Application(Qt Gui应用)
    • 自动创建“工程名.pro”文件
    • 自动创建“类名.cpp“
    • 自动创建”类名.h“
    • 自动创建“main.cpp”
    • 自动创建“类名.ui”,编译后生成“ui_类名.h”

QtGui创建

  • QMainWindow类提供一个有菜单条、锚接窗口(工具条)、状态条的主应用程序窗口
  • QDialog类是对话框窗口的基类。最普通的顶级窗口
  • Qwidget类是所有用户界面对象的基类
    • QMainWindow、QDialog、QFrame直接继承Qwidget类

QT创建多窗口应用

1、创建第一个窗口nGui

2、右键nGUI — add new

image-20220617231729597

image-20220617231748343

3、编辑第一个dialog页面

image-20220617233426941

4、添加槽函数

  • F4拖拽添加

image-20220618012531686

  • 利用+添加——但是如果要自定义槽函数,此种方法不可行

image-20220617233903319

  • 右键Go to Slot

image-20220617235328548

要实现的功能:单击按钮使对话框关闭并发出Accepted信号功能

5、在主函数中编写逻辑

#include "ngui.h"
#include "mydlg.h"
#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    nGui w;
    myDlg my1;
    if(my1.exec()==QDialog::Accepted){
        w.show();
        return a.exec();
    }
    else{
        return 0;
    }
}

如果ui界面出现灰色,使用F3启用编辑

6、编写第二个widget界面

image-20220618000836404

7、在widget.h中声明dialog的实体类

myDlg my2;

8、在widget.cpp中的槽函数中展示实体类

my2.show()

9、页面效果展示

image-20220618001329016

QT实现登录对话框——无链接数据库

1、创建登录窗口ui界面

image-20220618015332545

2、建立对应的槽函数

  • 退出

  • 登录

void LoDlg::on_login_clicked()
{
    //判断账户密码正确,trimmed用来防止输入用户名出现空格干扰
    if(ui->user->text().trimmed()=="qt"&&ui->pwd->text()=="123456"){
        accept();
    }
    else{
        QMessageBox::warning(this,"WARNING","username or password Error!",QMessageBox::Yes);
        //如果密码和账户输入错误,则清空输入框并聚焦于第一个输入框
        ui->user->clear();
        ui->pwd->clear();
        ui->user->setFocus();
    }
}

3、编写主函数

#include "login.h"
#include "lodlg.h"

#include 

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

    LoDlg login;
    //先弹出登录,登录成功跳转到主页面
    if(login.exec()==QDialog::Accepted)
    {
        w.show();
        return a.exec();
    }
    else
    {
        return 0;
    }
}

4、编写主页面ui界面

image-20220618015745043

5、运行结果

image-20220618015836464

QT操作sqlite数据库实现Slider

1、设计ui界面

image-20220618020045677

2、在pro工程文件中添加sql

QT       += sql

3、创建头文件连接数据库、创建数据库——connection.h

#ifndef CONNECT_H
#define CONNECT_H

#include
#include

static bool createConnection(){
    //type of db    :Qsqlite
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    //name of db    :test
    db.setDatabaseName("test.db");
    //db can not open
    if(!db.open()){
        return false;
    }
    //create a class named 'query'
    QSqlQuery query;
    //create a table named 'record'
    query.exec("create table record(id integer primary key autoincreament,temperature integer)");
    //insert data
    query.exec("insert into record values(1,1)");
    return true;
}

#endif // CONNECT_H

4、申明页面对应的槽函数——slider.h

#ifndef SLIDER_H
#define SLIDER_H

#include 

QT_BEGIN_NAMESPACE
namespace Ui { class slider; }
QT_END_NAMESPACE

class slider : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_pushButton_clicked();

    void on_verticalSlider_valueChanged(int value);

private:
    Ui::slider *ui;
};
#endif // SLIDER_H

5、编写槽函数逻辑和初始化代码——slider.cpp

#include "slider.h"
#include "ui_slider.h"
#include "connect.h"

QString lastvalue;

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

    QSqlQuery query;
    //select DESC
    query.exec("select * from record order by id DESC");
    //first record will be writen down,and then move until last one
    query.next();
    //transform the type of 'temperature' into Integer
    int c = query.value(1).toInt();
    //set initialized location about slider
    ui->verticalSlider->setValue(c);
}

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

void slider::on_verticalSlider_valueChanged(int value)
{
    QString v = QString::number(value);
    ui->label->setText(v);
    lastvalue = v;
}


void slider::on_pushButton_clicked()
{
    QSqlQuery query;
    QString sql = "insert into record(temperature) values("+lastvalue +")";
    query.exec(sql);
    qApp->quit();
}

6、完善主函数逻辑——main.cpp

#include "slider.h"
#include "connect.h"

#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    if(!createConnection){
        return 1;
    }

    slider w;
    w.show();
    return a.exec();
}

QT实现登录对话框——链接数据库

1、设计页面——登录注册+LCD显示主页面

image-20220618022417557

image-20220618022443561

2、在pro工程文件中添加sql

3、创建数据库头文件——connection.h

#ifndef CONNECT_H
#define CONNECT_H

#include 
#include 
#include 
#include 

static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("data.db");
    if(!db.open())
    {
        QMessageBox box;
        box.setText("open database failure!");
        box.exec();
        return false;
    }
    QSqlQuery query;
    QString s="create table login(name varchar(10) primary key, passwd varchar(20))";
    qDebug()<

4、申明页面对应的槽函数——login.h、mainwindow.h

#ifndef LOGINDLG_H
#define LOGINDLG_H

#include 
#include 

namespace Ui {
class loginDlg;
}

class loginDlg : public QDialog
{
    Q_OBJECT
    
public:
    explicit loginDlg(QWidget *parent = 0);
    ~loginDlg();
    
private slots:
    void on_loginBtn_clicked();

    void on_registerBtn_clicked();

private:
    Ui::loginDlg *ui;
    QMessageBox box;
};

#endif // LOGINDLG_H
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private slots:
       void on_exitBut_clicked();

       void on_dial_valueChanged(int value);

private:
    Ui::MainWindow *ui;
    QSqlQueryModel *querymodel;
};

#endif // MAINWINDOW_H

5、完善login.cpp、main.cpp、mainwindow.cpp代码逻辑

#include "logindlg.h"
#include "ui_logindlg.h"
#include 
#include 

loginDlg::loginDlg(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::loginDlg)
{
    ui->setupUi(this);
    ui-> pwdLineEdit-> setEchoMode(QLineEdit::Password);
}

loginDlg::~loginDlg()
{
    delete ui;
}
//登录
void loginDlg::on_loginBtn_clicked()
{
    QString user = ui->usrLineEdit->text();
    QString pass = ui->pwdLineEdit->text();
    if(user.isEmpty()||pass.isEmpty())
    {
        box.setText("user or pass is empty");
        box.exec();
     }
    else
    {
        QString s=QString("select * from login where name=='%1'").arg(user);
        qDebug() << s;
        QSqlQuery query;
        if(query.exec(s))
        {
            if(query.first())
            {
                if(query.value(1).toString()==pass)
                {
                    box.setText("login success");
                    box.exec();
                    accept();
                }
               else
                {
                    box.setText("passwd is wrong");
                    box.exec();
                }
            }
            else
            {
                box.setText("user is not exist");
                box.exec();
            }
        }
    }
}
//注册
void loginDlg::on_registerBtn_clicked()
{
    QString user = ui->usrLineEdit->text();
    QString pass = ui->pwdLineEdit->text();
    if(user.isEmpty()||pass.isEmpty())
    {
        box.setText("user or pass is empty");
        box.exec();
    }
   else
    {
        QString s = QString("insert into login values('%1','%2')").arg(user).arg(pass);
        qDebug()<usrLineEdit->clear();//清空用户名输入框
    ui->pwdLineEdit->clear();//清空密码输入框
    ui->usrLineEdit->setFocus();//将光标转到用户名输入框
}
#include 
#include "mainwindow.h"
#include "logindlg.h"
#include "connect.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    if(!createConnection())
    {
        return false;
    }
    MainWindow w;
    loginDlg login;
    if(login.exec()==QDialog::Accepted)
    {
        w.show();
        return a.exec();
    }
    else return 0;
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    querymodel = new QSqlQueryModel(this);
    QString s = "select * from lcd";
    querymodel->setQuery(s);
    ui->tableView->setModel(querymodel);

    QSqlQuery query;
    if(query.exec(s))
    {
        query.last();
        int c = query.value(1).toInt();
        ui->dial->setValue(c);
        ui->lcdNumber->display(c);
    }

}

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

void MainWindow::on_exitBut_clicked()
{
    int n = ui->dial->value();
    QString s =QString("insert into lcd(n) values(%1)").arg(n);
    qDebug()<exit();
}

void MainWindow::on_dial_valueChanged(int value)
{
    ui->lcdNumber->display(value);
}

文章作者: 寜笙
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 寜笙 !
 上一篇
2022-06-21 寜笙
下一篇 
2022-06-04 寜笙
  目录