Ubuntu20进行QT6.1.1开发实例在1中增加了delegate

在这里插入图片描述
资源上传:https://download.csdn.net/download/weixin_44152895/19389664?spm=1001.2014.3001.5503
欢迎下载

s.pro

#2021.5.14,QT界面及MVC 实例demo

QT       += core gui sql widgets                  #表明使用哪些模块,模块就是类的集合。

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets   #版本大于4的要添加widgets

CONFIG   += c++11
TARGET    = Ss                                    #指定生成目标文件的名称
TEMPLATE  = app                                   #使用app模块,表明是应用程序

SOURCES += \
    connection.cpp \
    main.cpp \
    dialog.cpp \
    mysql.cpp \
    simdialog.cpp

HEADERS += \
    connection.h \
    dialog.h \
    mysql.h \
    simdialog.h

FORMS += \
    dialog.ui \
    mysql.ui \
    simdialog.ui

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

RESOURCES += \
    qss.qrc

connection.h

#ifndef CONNECTION_H
#define CONNECTION_H

#include <QMessageBox>                                //提供一个模态对话框,用于通知用户或询问用户一个问题并接收答案。
#include <QSqlDatabase>                               //表示一个数据库链接
#include <QSqlQuery>                                  //提供了对数据库记录的Select、Insert、Update、Delete操作
#include <QItemDelegate>
#include <QModelIndex>
#include <QObject>
#include <QSize>

static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); //静态连接
db.setHostName("127.0.0.1");                           //主机名
db.setDatabaseName("test");                            //数据库名
db.setUserName("root");                                //用户名
db.setPassword("123123");                              //密码
if (!db.open())
{                                      //open函数创建实际的物理连接
QMessageBox::critical(0, QObject::tr("无法打开数据库"),"无法创建数据库连接! ", QMessageBox::Cancel);
return false;
}

//下面来创建表,如果 MySQL 数据库中已经存在同名的表,那么下面的代码不会执行
QSqlQuery query(db);                                   //指定数据库
query.exec("SET NAMES 'Latin1'");                      //使数据库支持中文
// 创建 course 表
query.exec("create table course (id int primary key, name varchar(20),teacher varchar(20),ter varchar(20))");
query.exec("insert into course values(0, '数学', '刘老师','s')");
query.exec("insert into course values(1, '英语', '张老师','d')");
query.exec("insert into course values(2, '计算机', '李老师','ew')");
query.exec("insert into course values(3, '计算机1', '李老师1','ew2')");
query.exec("insert into course values(5, '计算机3', '李老师1','ew2')");

return true;
}
#endif // CONNECTION_H

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QStandardItemModel>
#include <QTableView>
#include <QDialog>
#include "simdialog.h"
#include "mysql.h"
#include <QPushButton>

/*
QT5-----MCV-MCD

model:
QSqlQueryModel、QSqlTableModel和QSqlRelationalTableModel:存取数据库数
据如果上面和下面的标准模型不能满足你的需要,就必须继承QAbstractItemModel、
QAbstractListModel或者QAbstractTableModel,创建自己的模型类。

view:
QListView用于显示列表,QTableView用于显示表格,QTreeView用于显示层次数据。
这些类都是QAbstractItemView的子类。

delegate:
QAbstractItemDelegate则是所有委托的抽象基类,默认的委托实现是QStyledItemDelegate。
但是,QStyledItemDelegate和QItemDelegate都可以作为视图的编辑器,二者的区别在于,
QStyledItemDelegate使用当前样式进行绘制。在实现自定义委托时,推荐使
用QStyledItemDelegate作为基类,或者结合 Qt style sheets。

#include <QAbstractItemModel>//所有模型都是它的子类,这个类定义了供视图和委托访问数据的接口
#include <QStringList>       //存储简单的字符串列表
#include <QFileSystemModel>  //本地系统的文件和目录信息
#include <QStandardItemModel>//用于树形结构的存储
*/

QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
class Dialog : public QDialog
{
    Q_OBJECT                               //信号与槽需要用到

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

private slots:
    void initForm();
    void RadioButtonClick();                //必须初始化


private slots:
    void on_pushButton_Minimize_clicked();
    void on_pushButton_Maximize_clicked();
    void on_pushButton_Close_clicked();
    void on_pushButton_Start_clicked();
    void on_pushButton_Stop_clicked();
    void on_pushButton_Set_clicked();
    void on_pushButton_Debug_clicked();
    void on_pushButton_Alarm_clicked();
    void on_pushButton_Form_clicked();
    void mySlot();


private:
    Ui::Dialog         *ui;
    simDialog          *siDialog;
    mysql              *mysqlwindow;
    QStandardItemModel *mModel;         //定义,后面得初始化
    QPushButton b1;
    QPushButton *b2;

};


#include <QItemDelegate>
class DateDelegate:public QItemDelegate
{
    Q_OBJECT
public:
    //指定父类,parent参数指明了组件的父组件,这样,当父组件delete时,Qt可以保证所有子组件——也就是parent指针指向这个组件的所有组件——都会被正确的delete掉。
    DateDelegate(QObject *parent = 0);
    //创建编辑器,完成创建控件工作,创建由参数中Qmodelindex对象指定的表项数据的编辑控件,并对内容进行限定。
    QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;//创建控件
    //为编辑器设置数据,设置控件显示的数据,将model中的数据更新至Delegate中,相当于初始化工作。
    void setEditorData(QWidget* editor,const QModelIndex &index) const;
    //将数据写入到模型,将DElegate 中对数据的改变更新至model中。
    void setModelData(QWidget* editor,QAbstractItemModel *model, const QModelIndex &index) const;
    //更新编辑器布局,更新控件区的显示
    void updateEditorGeometry(QWidget* editor,const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
class ComboDelegate:public QItemDelegate
{
    Q_OBJECT
public:
    //指定父类,parent参数指明了组件的父组件,这样,当父组件delete时,Qt可以保证所有子组件——也就是parent指针指向这个组件的所有组件——都会被正确的delete掉。
    ComboDelegate(QObject *parent = 0);
    //创建编辑器,完成创建控件工作,创建由参数中Qmodelindex对象指定的表项数据的编辑控件,并对内容进行限定。
    QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;//创建控件
    //为编辑器设置数据,设置控件显示的数据,将model中的数据更新至Delegate中,相当于初始化工作。
    void setEditorData(QWidget* editor,const QModelIndex &index) const;
    //将数据写入到模型,将DElegate 中对数据的改变更新至model中。
    void setModelData(QWidget* editor,QAbstractItemModel *model, const QModelIndex &index) const;
    //更新编辑器布局,更新控件区的显示
    void updateEditorGeometry(QWidget* editor,const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
class SpinDelegate:public QItemDelegate
{
    Q_OBJECT
public:
    //指定父类,parent参数指明了组件的父组件,这样,当父组件delete时,Qt可以保证所有子组件——也就是parent指针指向这个组件的所有组件——都会被正确的delete掉。
    SpinDelegate(QObject *parent = 0);
    //创建编辑器,完成创建控件工作,创建由参数中Qmodelindex对象指定的表项数据的编辑控件,并对内容进行限定。
    QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;//创建控件
    //为编辑器设置数据,设置控件显示的数据,将model中的数据更新至Delegate中,相当于初始化工作。
    void setEditorData(QWidget* editor,const QModelIndex &index) const;
    //将数据写入到模型,将DElegate 中对数据的改变更新至model中。
    void setModelData(QWidget* editor,QAbstractItemModel *model, const QModelIndex &index) const;
    //更新编辑器布局,更新控件区的显示
    void updateEditorGeometry(QWidget* editor,const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
#endif // DIALOG_H

mysql.h

#ifndef MYSQL_H
#define MYSQL_H

#include <QWidget>
#include <QSqlTableModel>

namespace Ui {
class mysql;
}

class mysql : public QWidget
{
    Q_OBJECT

public:
    explicit mysql(QWidget *parent = nullptr);
    ~mysql();

private slots:
    void on_pushButton_submit_clicked();
    void on_pushButton_revocation_clicked();
    void on_pushButton_add_clicked();
    void on_pushButton_delete_clicked();
    void on_pushButton_5_clicked();
    void on_pushButton_6_clicked();
    void on_pushButton_7_clicked();
    void on_pushButton_8_clicked();
    void on_pushButton_9_clicked();


private:
    Ui::mysql *ui;
    QSqlTableModel *model;
};

#endif // MYSQL_H

simdialog.h

#ifndef SIMDIALOG_H
#define SIMDIALOG_H

#include <QDialog>

namespace Ui {
class simDialog;
}

class simDialog : public QDialog
{
    Q_OBJECT

public:
    explicit simDialog(QWidget *parent = nullptr);
    ~simDialog();

private slots:
    void on_pushButton_clicked();

private:
    Ui::simDialog *ui;
};

#endif // SIMDIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include <QScreen>
#include <QMenu>
#include <QMenuBar>
#include <QAction>
#include <QDebug>
#include <QToolBar>
#include <QStatusBar>
#include <QLabel>
#include <QTextEdit>
#include <QDockWidget>
#include <QMainWindow>
#include <QStandardItemModel>
#include <QTableView>
#include <QFile>
#include <QTextStream>
#include <QApplication>



//换行符问题解决,主要是在代码中用中文字符,导致的,加入下面代码即可。
#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif


Dialog::Dialog(QWidget *parent)                                      //构造函数
    : QDialog(parent), mModel(new QStandardItemModel())              //初始化
    , ui(new Ui::Dialog)
{
//    b1.setParent(this);
//    b1.setText("close");
//    b1.move(1,1);
//指定父对象后,直接或间接继承于QObject.子对象如果动态创建空间new,不需要手动delete.
//    b2 = new QPushButton(this);
//    b2->setText("sdwwe");
//    //(信号发出者,指针类型/&发送者的类名::信号名字/this信号接收者/曹函数:&接收的类名::槽函数名字)
//    connect(&b1,&QPushButton::pressed ,this,&Dialog::close);
//    //自定义曹函数,普通函数的用法
//    connect(b2,&QPushButton::released,this,&Dialog::mySlot);
//    connect(b2,&QPushButton::released,&b1,&QPushButton::hide);

    //this->xxx指本类的xxx
    //ui->xxx指ui文件上的xxx
    //如果本类包含ui文件,那么ui->xxx,this->ui->xxx一样。             //设置表头

    mModel->setHorizontalHeaderItem(0, new QStandardItem(QObject::tr("Name")));
    mModel->setHorizontalHeaderItem(1, new QStandardItem(QObject::tr("Type")));
    mModel->setHorizontalHeaderItem(2, new QStandardItem(QObject::tr("Size")));
    mModel->setHorizontalHeaderItem(3, new QStandardItem(QObject::tr("Time")));

//    for(int i =0;i<5;i++)
//    {
//        QList<QStandardItem *> item;
//        item.append(new QStandardItem(QObject::tr("次出场")));
//        item.append(new QStandardItem(QObject::tr("cs和s")));
//        item.append(new QStandardItem(QObject::tr("1009")));
//        item.append(new QStandardItem(QObject::tr("2021-5-14")));
//        mModel->appendRow(item);
//    }

    QFile file("test.txt");
    if(file.open(QFile::ReadOnly|QFile::Text))
    {
        QTextStream stream(&file);//创建 QTextStream流操作对象, 使与QFile对象file绑定。
        QString line;

        mModel->removeRows(0,mModel->rowCount(QModelIndex()),QModelIndex());//删除多余的行,rowcount获取表的行数。
        int row =0;
        do{
            line=stream.readLine();//读取一行
            if(!line.isEmpty())
            {
                mModel->insertRows(row,1,QModelIndex());
                QStringList pieces = line.split(",",Qt::SkipEmptyParts);//以","为分割符,进行切割并跳过空格
                mModel->setData(mModel->index(row,0,QModelIndex()),pieces.value(0));//把索引处的值设置为value
                mModel->setData(mModel->index(row,1,QModelIndex()),pieces.value(1));
                mModel->setData(mModel->index(row,2,QModelIndex()),pieces.value(2));
                mModel->setData(mModel->index(row,3,QModelIndex()),pieces.value(3));
                row++;
            }
        }while(!line.isEmpty());
        file.close();
    }

    ui->setupUi(this);             //界面初始化,setupUi是我们画界面和写程序之间的桥梁。
    ui->tableView1->setModel(mModel);                          //绑定model和view

    this->initForm();
    DateDelegate *dateDelegate = new DateDelegate;
    ui->tableView1->setItemDelegateForColumn(1,dateDelegate);
    ComboDelegate *comboDeledate = new ComboDelegate;
    ui->tableView1->setItemDelegateForColumn(2,comboDeledate);
    SpinDelegate *SpinDeledate = new SpinDelegate;
    ui->tableView1->setItemDelegateForColumn(3,SpinDeledate);
}

void Dialog::mySlot()
{
    b2->setText("123");
}


Dialog::~Dialog()                                              //析构函数
{
    delete ui;
}

void Dialog::initForm()
{
    //定义一个QList范型类的对象变量,里面保存的都是QRadioButton类型的指针。
    //对于范型类型T,用法就要这样子T<M> a 或者T<M> *b,前者和你提问的情况一样,
    //后者就是定义了一个指针,使用的时候还需要b=new T<M>
    //获取当前窗口所有的QRadioButton控件,返回给Qlist容器。
    //findChildren<QRadioButton *>(),就是嵌套页面上的QToolButton,不好直接引用,
    //而()里是控件的objectName
    QList<QRadioButton *> tbtns = ui->widgetRadio->findChildren<QRadioButton *>();
    foreach (QRadioButton *btn, tbtns) {
        btn->setCheckable(true);
        connect(btn, SIGNAL(clicked()), this, SLOT(RadioButtonClick()));
    }
    ui->radioButton_Cameraview->click();
}

void Dialog::RadioButtonClick()
{
    QRadioButton *b = (QRadioButton *)sender();//sender获取发出信号的对象;
    QString name = b->text();

    QList<QRadioButton *> tbtns = ui->widgetRadio->findChildren<QRadioButton *>();
    foreach (QRadioButton *btn, tbtns) {      //foreach 关键字用于遍历容器中所有的项
        if (btn == b) {
            btn->setChecked(true);
        } else {
            btn->setChecked(false);
        }
    }

    if (name == "相机视图") {
        ui->stackedWidget->setCurrentIndex(0);//按页面号打开页面
    } else if (name == "详细") {
        ui->stackedWidget->setCurrentIndex(1);
    } else if (name == "概览") {
        ui->stackedWidget->setCurrentIndex(2);
    } else if (name == "分类") {
        ui->stackedWidget->setCurrentIndex(3);
    }
}

void Dialog::on_pushButton_Minimize_clicked()
{
    this->showMinimized();
}


void Dialog::on_pushButton_Maximize_clicked()
{
    static bool max = false;
    static QRect location = this->geometry();
    if (max) {
        this->setGeometry(location);    //回复窗口原大小和位置
//        ui->maxBtn->setIcon(QIcon(":/MAX_.png"));
    }else {
//        ui->maxBtn->setIcon(QIcon(":/minMAX.png"));
        location = this->geometry();	//最大化前记录窗口大小和位置
        //this->setGeometry(qApp->desktop()->availableGeometry());
        this->showFullScreen();     	//设置窗口铺满全屏
    }
    max = !max;


}


void Dialog::on_pushButton_Close_clicked()
{
    close();
}


void Dialog::on_pushButton_Start_clicked()
{

}


void Dialog::on_pushButton_Stop_clicked()
{

}


void Dialog::on_pushButton_Set_clicked()
{
    siDialog = new simDialog(this);
    siDialog->setModal(false);
    siDialog->setWindowFlags(Qt::FramelessWindowHint);
    siDialog->show();
}


void Dialog::on_pushButton_Debug_clicked()
{

}

#include <QApplication>
void Dialog::on_pushButton_Alarm_clicked()
{

}


void Dialog::on_pushButton_Form_clicked()
{
    mysqlwindow =new mysql(this);
    mysqlwindow->show();
    mysqlwindow->move (this->geometry().center() - mysqlwindow->rect().center());

}








#include <QComboBox>
#include <QDateTimeEdit>
DateDelegate::DateDelegate(QObject *parent):QItemDelegate(parent)
{

}

QWidget *DateDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QDateTimeEdit *editor = new QDateTimeEdit(parent);          //新建一个QDateTimeEdit对象作为编辑时的输入控件。
    editor->setDisplayFormat("yyyy-MM-dd");                     //设置对象显示格式为yyy-mm-dd,这是标准显示格式。
    editor->setCalendarPopup(true);                             //以下拉菜单的方式显示
    editor->installEventFilter(const_cast<DateDelegate*>(this));//安装事件过滤器,使delegate能捕捉QDateTimeEdit对象的事件。
    return editor;
}

void DateDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QString dateStr=index.model()->data(index).toString();      //获取数据
    QDate date = QDate::fromString(dateStr,Qt::ISODate);        //转换类型为QDate类型,ISODate表示日期格式是以ISO 格式保存的。
    QDateTimeEdit *edit = static_cast<QDateTimeEdit*>(editor);  //将editor转换为QDatetimeedit对象,以获得编辑控件的对象指针。
    edit->setDate(date);                                        //设置控件的显示数据
}

void DateDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QDateTimeEdit *edit=static_cast<QDateTimeEdit*>(editor);    //通过紧缩转换获得编辑控件的对象指针
    QDate date = edit->date();                                  //获得编辑控件中的数据更新。
    model->setData(index,QVariant(date.toString(Qt::ISODate))); //调用setdata函数将数据修改更新到model中。
}

void DateDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

/

ComboDelegate::ComboDelegate(QObject *parent):QItemDelegate(parent)
{

}


QWidget *ComboDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QComboBox *editor = new QComboBox(parent);
    editor->addItem("工人");
    editor->addItem("学生");
    editor->addItem("和尚");
    editor->addItem("达人");
    editor->installEventFilter(const_cast<ComboDelegate*>(this));
    return editor;
}

void ComboDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QString dateStr=index.model()->data(index).toString();
    QComboBox *box = static_cast<QComboBox*>(editor);
    int i=box->findText(dateStr);
    box->setCurrentIndex(i);
}

void ComboDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QComboBox  *box=static_cast<QComboBox*>(editor);
    QString str=box->currentText();
    model->setData(index,str);
}

void ComboDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

/// \brief SpinDelegate::SpinDelegate
/// \param parent
#include <QSpinBox>
SpinDelegate::SpinDelegate(QObject *parent):QItemDelegate(parent)
{

}


QWidget *SpinDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QSpinBox *editor = new QSpinBox(parent);
    editor->setRange(0,1000);
    editor->installEventFilter(const_cast<SpinDelegate*>(this));
    return editor;
}

void SpinDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    int value = index.model()->data(index).toInt();
    QSpinBox *spin = static_cast<QSpinBox*>(editor);
    spin->setValue(value);
}

void SpinDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QSpinBox  *box=static_cast<QSpinBox*>(editor);
    int value = box->value();
    model->setData(index,value);
}

void SpinDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

main.cpp

#include "dialog.h"
//应用程序类,头文件和类名一样。
#include <QApplication>
#include <QPushButton>
#include <QtCore/QCoreApplication>
#include <QSqlDatabase>
#include <QDebug>
#include "connection.h"
#include <QStandardItemModel>
#include <QTableView>
#include <QFile>
#include <QTextStream>
#include <QApplication>
int main(int argc, char *argv[])
{
    //有且只有一个应用程序类的对象
    QApplication a(argc, argv);
    //w就是一个窗口
    Dialog w;  //在这里会执行Dialog的构造函数。
    //隐藏窗体标题栏
    w.setWindowFlags(Qt::FramelessWindowHint);
    //w.setWindowTitle("XXXX你好");//设置标题
    //窗口创建默认是隐藏,需要人为显示
//    w.show();
    if (!createConnection()) return 1;
    w.showMaximized();

    //设置按钮。
//    QPushButton b;
//    b.setText("ddd");//按钮显示
//    b.setParent(&w); //指定父对象
//    b.move(100,100); //移动坐标
//    b.show(); //得指定父对象,不然单独显示。
    //指定父对象:1,setParent  2,通过构造函数传参。


    //让程序一直执行,等待用户操作,等待事件的发生。
    return a.exec();
}

mysql.cpp

#include "mysql.h"
#include "ui_mysql.h"
#include <QSqlQuery>
#include <QSqlTableModel>
#include <QSqlError>
#include <QSqlRelationalDelegate>
#include <QMessageBox>

mysql::mysql(QWidget *parent) :QWidget(parent),ui(new Ui::mysql)
{
    ui->setupUi(this);
    model = new QSqlTableModel(this);
    model->setTable("course");
    model->select();
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);//要提交才能生效,OnFieldChange只要字段改变就写入数据库。
    ui->tableView->setModel(model);
//    ui->tableView->setItemDelegate(new QSqlRelationalDelegate(ui->tableView));
}

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

void mysql::on_pushButton_submit_clicked()
{
    model->database().transaction();              // 开始事务操作
    if (model->submitAll()) {                     //提交所有数据到数据库中
        model->database().commit();               //提交成功,事务将真正修改数据库数据
    } else {
        model->database().rollback();             //提交失败,事务回滚
        QMessageBox::warning(this, tr("tableModel"),
                             tr("数据库错误: %1").arg(model->lastError().text()));
    }
}


void mysql::on_pushButton_revocation_clicked()
{
    model->revertAll();                      //撤销修改
}


void mysql::on_pushButton_add_clicked()
{
    int rowNum = model->rowCount();         // 获得表的行数
    model->insertRow(rowNum);               // 添加一行
    model->setData(model->index(rowNum,0),rowNum+1);
}


void mysql::on_pushButton_delete_clicked()
{
    int curRow = ui->tableView->currentIndex().row();   // 获取选中的行
    model->removeRow(curRow);                           //删除一行
    int ok = QMessageBox::warning(this,tr("删除当前行!"),
                                  tr("你确定删除当前行吗? "),QMessageBox::Yes, QMessageBox::No);
    if(ok == QMessageBox::No)
    {                                                  // 如果不删除, 则撤销
        model->revertAll();
    } else {                                           // 否则提交, 在数据库中删除该行
        model->submitAll();
    }
}

void mysql::on_pushButton_5_clicked()
{
    //id 属性, 即第 0 列, 升序排列
    model->setSort(0, Qt::AscendingOrder);
    model->select();
}


void mysql::on_pushButton_6_clicked()
{
    model->setSort(0, Qt::DescendingOrder);
    model->select();
}


void mysql::on_pushButton_7_clicked()
{

    QString name = ui->lineEdit->text();
    if(name.length()){
        //根据姓名进行筛选, 一定要使用单引号
        model->setFilter(QString("name = '%1'").arg(name));
        model->select();//显示结果
    }else
    {
        QMessageBox::warning(this, tr("Warning"),tr("姓名不能为空") );
    }

}


void mysql::on_pushButton_8_clicked()
{
    model->setTable("course");
    model->select();
}


void mysql::on_pushButton_9_clicked()
{
    close();
}





simdialog.cpp

#include "simdialog.h"
#include "ui_simdialog.h"

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

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

void simDialog::on_pushButton_clicked()
{
    close();
}


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

效果图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt 5.14.2使用FFmpeg 6.1.1库进行视频处理时,你需要遵循以下步骤来初始化FFmpeg库和上下文: 1. **包含头文件**: 首先,在你的Qt项目,添加FFmpeg库的头文件。通常情况下,这些头文件位于`<path-to-ffmpeg>/include/ffmpeg`或`<path-to-ffmpeg>/include/libavcodec`等目录下。在`.cpp`文件顶部,添加相应的头文件: ```cpp #include <ffmpeg/avcodec.h> #include <ffmpeg/avformat.h> #include <ffmpeg/avutil.h> ``` 2. **链接静态库或动态库**: 根据你的构建设置,选择链接静态库(`.a`或`.lib`)还是动态库(`.dll`, `.so`, `.dylib`)。如果是动态链接,确保在构建系统添加了FFmpeg库的路径。例如,在CMakeLists.txt: ```cmake find_package(FFmpeg REQUIRED) target_link_libraries(your_target_name ${FFmpeg_LIBRARIES}) ``` 3. **初始化FFmpeg上下文**: 在开始处理之前,你需要创建一个`AVFormatContext`结构,它代表整个媒体文件或流的上下文。这通常在函数开始时完成: ```cpp AVFormatContext* fmtCtx = nullptr; avformat_network_init(); if (avformat_open_input(&fmtCtx, "your_video_file.mp4", NULL, NULL) != 0) { // 处理错误 } ``` `avformat_network_init()`用于初始化网络连接,如果处理网络源的话。 4. **解析媒体文件**: 成功打开输入后,调用`avformat_find_stream_info(fmtCtx, NULL)`来获取流的信息。 5. **解码器和编码器初始化**: 如果你打算读取或写入音频或视频,需要根据流找到对应的解码器或编码器并进行初始化。 6. **清理**: 在程序结束时,记得释放资源,如关闭文件和销毁上下文: ```cpp avformat_close_input(&fmtCtx); avformat_free_context(fmtCtx); avutil_license_free(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值