(QT)QT遇到的问题以及解决方法
最近在监督别人二轮考核,我要求他们的做的是用QT写出一个简简单单的财务管理系统,要求为:
A、登陆界面(包含用户名以及密码)
B、所有财务的展示(在什么时间、用于什么事情、一共花费多少钱、谁花费的或者给谁奖励的、谁登记的)
C、新增财务信息记录,并且存储到数据库中
因为自己对QT不是很熟悉,自己也试着做了一下,做完之后发现了以下一些小问题:
(1)禁止最大化和*拉伸
这个确实很需要,毕竟我不做控件自适应的,解决方法如下:
setWindowFlags(windowFlags() & ~Qt::WindowMaximizeButtonHint);
setFixedSize(this->width(),this->height());
这个也很重要,解决方法如下:
(需要添加头文件 #include <QDesktopWidget> )
QDesktopWidget* desktop = QApplication::desktop();
this->move( (desktop->width()-this->width())/2,(desktop->height()-this->height())/2);
(3)监听事件实现
我不太喜欢什么都用槽函数实现触发事件,我喜欢以下方法实现PushButton的触发事件,以下为解决方法:
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow),model(new QSqlQueryModel)
{
ui->setupUi(this);
//注册按钮监听事件
ui->btn_del->installEventFilter(this);
}
//重写eventFilter来实现按钮触发事件
bool MainWindow::eventFilter(QObject *target, QEvent *e)
{
if(target == ui->btn_del) //判断是否为相对应的控件
{
if(e->type() == QEvent::MouseButtonPress) //是否进行鼠标单击
{
//执行方法
}
}
}
关于Qevent的常用触发事件如下:
QEvent::Enter 经过该控件就触发事件Mouse enters widget's boundaries (QEnterEvent).
QEvent::MouseButtonDblClick 鼠标双击控件触发Mouse press again (QMouseEvent).
QEvent::MouseButtonPress 鼠标点击触发Mouse press (QMouseEvent).
QEvent::MouseButtonRelease 鼠标点击后释放触发Mouse release (QMouseEvent).
QEvent::MouseMove 鼠标拖拽控件触发Mouse move (QMouseEvent).
这个方法我也是需要的,因为报账肯定不能超过当前日期嘛,解决办法如下:(需添加头文件 #include<QString> 以及#include<QMessage>)
//注意"yyyy/M/d"为日期格式,形如2017/6/4,是没有前缀0的,如需要形如2017/06/04的话,请修改为"yyyy/MM/dd"
QString ch = QDate::currentDate().toString("yyyy/M/d");
if(QString::compare(ui->dateEdit->text(),ch) > 0)
{
QMessageBox::about(this,"错误","财务信息时间已经超出当前日期!");
return false;
}
(5)数据库操作
这个的话,我用的是QSqlQuery进行增删查改,实例代码如下:(需添加头文件#include <QSqlQuery>)
QSqlQuery query;
//SQL语句
query.prepare("insert into information(who,position) values(?,?)");
//按照问号(?)顺序加入数据
query.addBindValue(str1);
query.addBindValue(str2);
if(query.exec()){
//执行成功
}
else{
//执行失败
}
(6) QMessageBox的各种使用方法
发现QMessageBox有很多种变化形态,而且很实用,以下为我常用的几种使用方式:(需添加头文件 #include <QMessage>)
//弹出普通对话框
QMessageBox::about(this,"此为对话框标题","此为对话框内容");
//弹出错误对话框
QMessageBox::critical(0,"此为对话框标题","此为对话框内容", QMessageBox::Cancel);
//实例——数据库连接失败
//需要头文件 #include <QMessageBox> #include <QSqlDatabase> #include <QSqlError>
QMessageBox::critical(0, qApp->tr("Cannot open database"),
db.lastError().databaseText(), QMessageBox::Cancel);
//弹出警示对话框
int ok = QMessageBox::warning(this,"警告","是否删除当前行的记录",QMessageBox::Yes,QMessageBox::No);
if(ok == QMessageBox::Yes){
//按下yes后操作
}else{
//按下no后操作
}
(7)tableView的一些设置
我用tableView是因为将数据库的东西导入到tableView里面,我还需要对此调整,解决方法如下:
//导入数据
ui->tableView->setModel(model);
//根据内容来调整行高和宽度
ui->tableView->resizeRowsToContents();
ui->tableView->resizeColumnsToContents();
//间隔变色
ui->tableView->setAlternatingRowColors(true);
(8)设置模态对话框
这个其实没我想的那么复杂,解决方法如下:
setWindowModality(Qt::ApplicationModal);
这里有必要解释一下
/** Qt::NonModal :该窗口不是模态,不会阻塞其它界面接受输入信息;
Qt::WindowModal:该窗口是一个当以层次的模态窗口,会阻塞它的父窗口、祖父窗口和各个兄弟窗口接受输入信息;
Qt::ApplicationModal:该窗口是应用模态窗口,会阻塞所有窗口接受输入信息。
*/
推荐阅读
-
Hive与Oracle之间利用Sqoop进行数据的导入导出时遇到的问题及解决方法
-
安装Eclipse ADT插件时遇到的问题与解决方法
-
深入android中The connection to adb is down的问题以及解决方法
-
setInterval和setTimeout的区别以及setInterval越来越快问题的解决方法
-
thrift安装遇到的问题以及解决方法(必看篇)
-
使用 Eclipse 给 APK 签名遇到的问题及解决方法
-
vue项目部署上线遇到的问题及解决方法
-
Hadoop环境搭建过程中遇到的问题以及解决方法
-
pyinstaller打包django项目成exe以及遇到的一些问题
-
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法