演示画面
用qt+mysql做了一个类似于网盘的小项目,支持上传、下载、删除,
没有什么技术含量,主要做了一个界面,练练手不错,后面也可以做复杂一点,比如下载队列,用到一些其它的方法,这个项目还是一开始看黑马的云盘项目想到的,但是他那个用到技术有点多,就想着能不能搞一个基于mysql的云盘项目,这个项目就很简单了,只要在mysql里面建一个表,然后连上去就可以运行了。
整体框架:
项目大致可以分为四个模块:
1,主界面
由一个Qtabview构成,在里面添加文件按钮(button_object)和上传(button_object)按钮,接受button_object和button_upload发出的信号并进行处理,同时利用mysql_db对象对数据库进行操作。
2,文件按钮(button_object)
封装的一个按钮,继承QToolbutton,在此基础上设置样式,发出文件的删除和下载信号
3,上传按键(button_upload)
和文件按钮一样,继承QToolbutton,本来是想用一个button_object实现的,但是一想两个按钮的响应方式不一样,干脆新写一个来的方便。主要发出文件上传的信号。
4,数据库类(mysql_db)
封装了mysql操作,包括增删改查,qt连接mysql通过一个ODBC来链接的,直接连有点麻烦。。
参考:QT连接Mysql数据库(详细成功版)_qt mysql_程序有序的博客-优快云博客
建表:
CREATE TABLE files (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
file_name VARCHAR(20) NOT NULL,
file_type VARCHAR(20) NOT NULL,
file_size BIGINT UNSIGNED NOT NULL CHECK (file_size >= 0),
file_content LONGBLOB
);
链接数据库部分:
db = QSqlDatabase::addDatabase("QODBC");
db.setHostName("127.0.0.1");
db.setPort(3306);
db.setDatabaseName("file_test_db"); //QODBC里面创建的数据库名,每一个数据库对应Mysql里面的数据库
db.setUserName("root");
db.setPassword("root");
bool ok = db.open();
if (ok){
qDebug()<<"success!";
}
else {
qDebug()<<"error open database because"<<db.lastError();
}
Qtabview设置部分:
//初始化表格
void main_table::init()
{
m_row = 0;
m_col = 0;
//模型初始化
if(model != nullptr)
{
// 清空数据模型中的行数
model->removeRows(0, model->rowCount());
// 更新视图
ui->tableView->setModel(Q_NULLPTR);
ui->tableView->reset();
ui->tableView->update();
delete model;
}
model = new QStandardItemModel();
model->setColumnCount(MAX_COL_NUM); //设置最大列数
//为表格控件设置数据模型
ui->tableView->setModel(model);
//隐藏行头和列头
ui->tableView->verticalHeader()->hide();
ui->tableView->horizontalHeader()->hide();
//隐藏标题栏
ui->tableView->setWindowFlags(Qt::FramelessWindowHint);
//去除表格线
ui->tableView->setShowGrid(false);
//设置表格的单元为只读属性,即不能编辑
ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
//设置根据内容自动对齐
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
ui->tableView->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
ui->tableView->horizontalHeader()->setMinimumSectionSize(100);
ui->tableView->verticalHeader()->setMinimumSectionSize(100);
//设置不可选中表格
ui->tableView->setSelectionMode(QAbstractItemView::NoSelection);
ui->tableView->verticalHeader()->setDefaultSectionSize(180); //设置默认行高
// //往表格中添加数据
model->setItem(m_row,m_col, new QStandardItem()); //必须要先往表格里面添加一个空的
}
将按钮模块添加进Qtabview部分
//将全部按钮添加进表
bool main_table::append_all_button()
{
int col =0;
int row =0;
for(auto t:m_list_button)
{
//换行判断
if(col == MAX_COL_NUM)
{
row++;
col = 0;
model->setItem(row, 0, new QStandardItem()); //表格新行添加一个新元素
}
ui->tableView->setIndexWidget(model->index(row,col++),t); //将按钮添加进表
//给所有按钮绑定上传下载事件
connect(t,&button_object::si_click_updown,[=](int id){
qDebug()<<"在main table 里面接受到了按钮"<<id<<"的上传";
download_file(id);
});
connect(t,&button_object::si_click_delete,[=](int id){
qDebug()<<"在main table 里面接受到了按钮"<<id<<"的下载";
delete_button(id);
});
}
//防止一行以及满6个了的情况,此时上传按钮需要换行显示
if(col == MAX_COL_NUM)
{
row++;
col = 0;
model->setItem(row, 0, new QStandardItem()); //表格新行添加一个新元素
}
//添加上传按钮
append_upload_buttton(row,col);
//将下一个添加按钮的位置存储起来
m_row = row;
m_col = col+1;
return true;
}
...
项目项目代码吧
写的比较菜,求指导。。。
项目源代码: