开学有课设的要求,大家都一顿网上源码download,有的出钱买,但是下载的有的调试不好,或者做的太牛批了不敢用,为了温习一下Qt,自己亲手写了一个,幸亏老师比较仁慈,作品比较low但也过了,在此做一下课设的总结。
做数据库的可视化的话,很多语言都能做,我们的课程要求是JDBC,也就是java数据库,但是大多数的老师应该都允许使用自己熟悉或者喜欢的语言。
我周围的人课设用的语言如下:
Java做图形界面的话无疑需要使用swing,一个比较好的插件是windowbuilder,需要的可以自行安装,效果就是可以自行拖拽按钮等控件来对图形界面进行设计:
Qt是基于C++语言进行开发的,使用MinGW进行编译运行的,Qt 的项目有ui文件,也可以直接对需要使用的容器和控件等进行拖拽来进行图形界面的设计:
Python图形界面可以使用pyQt,为什么叫pyqt呢,因为使用的模式和机制和qt的完全一样,应该说是用Python语言来实现Qt,需要安装模块pyqt5和pyqt5-tools,pyqt5-tools里面有designer可以对图形界面进行设计:
Qt和Java我都试过,但是作为以前使用c++比较多的情况下,感觉Qt更好用一点,也有朋友说Java难用,具体怎样可以去试试,总有一款适合自己。
上传限制5M。。。弄了两个gif
做了一个登陆界面,但是一般的界面框都是有边框的,下面是一个最简单的界面:
想要的效果是把这个边框去掉,这样就变成了两个问题:
解决方案:
//所需要的头文件要include
#include
-------------------------------------------------------------------
//去边框
setWindowFlags(Qt::FramelessWindowHint);
//setAttribute(Qt::WA_TranslucentBackground);//背景透明 这个用不到,不用透明
//拖拽:
void Widget::mouseMoveEvent(QMouseEvent *event)
{
if (m_bPressed)
move(event->pos() - m_point + pos());
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
Q_UNUSED(event);
m_bPressed = false;
}
void Widget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
m_bPressed = true;
m_point = event->pos();
}
}
用label也应该可以实现,但是label需要在最底层,而且上层控件的背景色都要是透明的,不是太方便,实现办法:
//需要的头文件
#include
#include
------------------------------------------------
//QPalette是窗口的属性背景
QPixmap pImage3 = QPixmap(":/image/bglog.jpg").scaled(this->size());
QPalette tPalette3 = this->palette();
tPalette3.setBrush(QPalette::Background, QBrush(pImage3));
this->setPalette(tPalette3);
这个就是上面gif图片的达康书记,用了stackwidget容器来切换到welcome界面,设置了一个定时器来制定界面显示时间:
#include
---------------------------------------------------------
void Widget::loginBtn_start()
{
//判断用户名和密码是否正确
if(ui->nameEdit->text().trimmed() == tr("admin")
&& ui->passwdEdit->text() == tr("123456"))
{
ui->stackedWidget->setCurrentIndex(1);
QPixmap pImage = QPixmap(":/image/king_meitu_1.jpg").scaled(this->size());
QPalette tPalette = this->palette();
tPalette.setBrush(QPalette::Background, QBrush(pImage));
this->setPalette(tPalette);
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(MainRun()));
timer->start(2000); //设置时间为2s
}else{
QMessageBox::warning(this, tr("Waring"),
tr("username or password error!"),
QMessageBox::Yes);
ui->nameEdit->clear();
ui->passwdEdit->clear();
ui->nameEdit->setFocus();
}
}
void Widget::MainRun()
{
this->hide();
MW.show(); //显示管理界面的窗口
}
#include
#include
#include
------------------------------------------------------
//打印支持的数据库驱动
qDebug() << QSqlDatabase::drivers();
dbcar = QSqlDatabase::addDatabase("QMYSQL"); //添加驱动
dbcar.setHostName("localhost");
dbcar.setUserName("root");
dbcar.setPassword("root");
dbcar.setDatabaseName("car");
if(!dbcar.open()) //连接失败弹框
{
QMessageBox::warning(this, "error!", dbcar.lastError().text());
return;
}
Qt提供了一种数据库的可视化模式:model-view模式,使用ui界面的Item Views里的table view来进行显示,使用model来存放数据库信息,然后把model放到view中就可以在ui中进行显示。
默认显示到view中的数据是可以直接修改并同步到数据库的。
#include
----------------------------------------------------------------------
TmodelOne->setTable("routeone"); //设置model关联的表
TmodelOne->setEditStrategy(QSqlTableModel::OnManualSubmit); //设置修改方式为手动提交,也就是说不可以直接修改,需要进行确定操作
ui->tableView->setModel(TmodelOne); //把model放到view中
TmodelOne->select(); //显示全部数据
//currentModel = TmodelOne; gif图中可见有许多的table需要显示,设置一个current来保存当前的model
#include
---------------------------------------------------------
QSqlRecord record = currentModel->record();
int row = currentModel->rowCount();
currentModel->insertRecord(row, record);
void MainWindow::on_ButtonDel_clicked()
{
//获取选中的模型
QItemSelectionModel *sModel =ui->tableView->selectionModel();
//取出模型中的索引
QModelIndexList list = sModel->selectedRows();
//删除所有选中的行
for(int i = 0; i < list.size(); i++)
{
currentModel->removeRow( list.at(i).row() );
}
}
修改可以直接双击修改内容,不过因为策略问题需要进行提交(下面会提到),提交之后就能同步到数据库中。
void MainWindow::on_ButtonQuery_clicked()
{
QString duan = ui->lineEditduan->text();
QString content = ui->lineEditContent->text();
QString queryt = QString("%1 = '%2'").arg(duan, content); //格式为name='Josephine'
currentModel->setFilter(queryt);
currentModel->select();
}
//因为使用的策略是手动提交,所以要用了submitAll时候才会在数据库中同步修改
if(!currentModel->submitAll())
QMessageBox::warning(this, "Error", dbcar.lastError().text());
---------------------------------------------------------------------------
//修改或添加之后没有submitAll之前想撤销操作
void MainWindow::on_ButtonCancel_clicked()
{
currentModel->revertAll();
currentModel->submitAll();
}
这一次是多个表,使用的是一个view,然后通过切换currentmodel来显示每个表对应的model的,一个model对应一个view,然后用stackwidget来通过不同的索引来显示每个view的话,好像会有问题:在stackwidget中的view不能进行修改,或者submitAll不成功等。
不知道是怎么回事,可能stackwidget会影响model-view模式吧。
总之作品还是比较简单的,Qt还是一个可以尝试的语言的。