欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(QT)QT遇到的问题以及解决方法

程序员文章站 2022-06-04 14:33:23
...

最近在监督别人二轮考核,我要求他们的做的是用QT写出一个简简单单的财务管理系统,要求为:

A、登陆界面(包含用户名以及密码)

B、所有财务的展示(在什么时间、用于什么事情、一共花费多少钱、谁花费的或者给谁奖励的、谁登记的)

C、新增财务信息记录,并且存储到数据库中


因为自己对QT不是很熟悉,自己也试着做了一下,做完之后发现了以下一些小问题:

(1)禁止最大化和*拉伸

这个确实很需要,毕竟我不做控件自适应的,解决方法如下:

setWindowFlags(windowFlags() & ~Qt::WindowMaximizeButtonHint);
setFixedSize(this->width(),this->height());


(2)窗体居中显示

这个也很重要,解决方法如下:

(需要添加头文件  #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).


(4)判断DateEdit控件的时间是否超过当前日期
这个方法我也是需要的,因为报账肯定不能超过当前日期嘛,解决办法如下:(需添加头文件 #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:该窗口是应用模态窗口,会阻塞所有窗口接受输入信息。
     */


相关标签: qt