qt+mysql 制作简易的图书管理系统的一些知识点

来源:互联网 发布:二代身份证识别器java 编辑:程序博客网 时间:2024/06/06 11:00

完整代码:https://github.com/KenGeng/BookManageSystemForDatabaseProject




宅了两天多的时间,一个人从零开始学Qt和c++,强行做出了一个图书管理系统

以下是效果图:




【没有审美QAQ


具体的代码要等到这学期结束之后再上传了。。。

以下的内容主要总结一下自己踩到的坑和一点点经验,比较杂乱:

tip1: 初学者如果要赶due的话,一定要用Qt designer来画UI 一定要用Qt designer来画UI 一定要用Qt designer来画UI!我刚开始参考了网上另一份详细的用QtMySQL做图书管理系统的学长(姐)的代码,想直接用代码布局,但尝试了一下午之后,还是选择了用Qt designer,用代码布局虽然很爽,很直观,并且很锻炼能力,但第一是看效果不容易,第二是Qt的类实在太多了,即使主要的基类不算多,可要一个一个试的话,实在太费时间。Qt designer相对就高效了不少,直接拖控件,Qt后台自动生成代码,即使我这种脑子不太灵光的人,一个下午也能画出差不多能用的UI。不过也要承认,真的手写500+行代码来布局的话,对Qt的套路肯定会熟悉很多。

tip2:显示日期与时间:

具体可以参考这个:http://blog.csdn.net/zzk197/article/details/7498593

先在构造函数里定义:

timer = new QTimer();(timer是个指针)

connect(timer, SIGNAL(timeout()), this, SLOT(updateTime()));

timer->start(1000);



void Widget::updateTime(){

    QDateTime current_date_time = QDateTime::currentDateTime();

    QString current_date = current_date_time.toString("yyyy-MM-dd \nhh:mm:ss\n ddd");

    QString text;

    text = current_date+" ";

    ui->dataText->setText(text);

}


tip3:Qtint转换成QString

这是个巨坑。。。刚开始对Qt里的query不太熟悉,忽略了类型的转换,结果查询语句一直失败,真的怀疑人生。。。一个一个试了之后,发现是在这出了问题。在Qt里调用select语句时,都是用的QString,粘合查询语句的时候,会把int转型,结果自然就有问题。

结局方法:

1.使用

QString QString::number ( long n, int base = 10 )  [static]

:

long a = 63;  QString s = QString::number(a, 10);     // s == "63"  

QString t = QString::number(a, 16).toUpper();         // t == "3F"

2.使用

long a = 63;  QString s = QString("%1").arg(a);

推荐第1种用法

转自:http://blog.163.com/humo_chen/blog/static/12733839520123171851711/


tip4QString的比较

操作符重载后,直接用“==”就可以;或者调用compare函数:

  1. QString::compare("a","b");  //值为0  
  2. QString::compare(“a”,“f");  //值为<0;  
  3. QString::compare("df","ab");         //值为>0;


tip5:Qt: QString::isEmpty()与QString::isNull()区别

搬运文档:

bool QString::isEmpty () const


Returns true if the string has no characters; otherwise returns false.


Example:


     QString().isEmpty();            // returns true

     QString("").isEmpty();          // returns true

     QString("x").isEmpty();         // returns false

     QString("abc").isEmpty();       // returns false

See also size().


bool QString::isNull () const


Returns true if this string is null; otherwise returns false.


Example:


     QString().isNull();             // returns true

     QString("").isNull();           // returns false

     QString("abc").isNull();        // returns false

Qt makes a distinction between null strings and empty strings for historical reasons. For most applications, what matters is whether or not a string contains any data, and this can be determined using the isEmpty() function.


tip6 vector的遍历

我是用最蠢的for循环。。。看了这个http://blog.csdn.net/u011543018/article/details/50724883之后才知道还有这样的操作oop学得太菜了


tip7 vector中添加元素的方法

.push_back(xxx);是最稳的


tip8. mysql修改列名:

alter table test change  column address address1 varchar(30)--修改表列名


tip9 标准对话框QMessageBox 

详细的可以参考这位前辈的:http://devbean.blog.51cto.com/448512/217694

我是用最直接的:

QMessageBox::about(0,QObject::tr("error"),"information isn't complete!");


tip10 登陆界面

刚开始做登录框,我是画了两个UI想实现一个界面的切换,但之间的交互我没做好,和数据库的连接总是有问题,我就简化了一下问题,直接把登陆的账号密码的输入和主程序放在一起了 

感觉这种需要切换界面的还是用代码布局比较单纯一些。


tip11  Qt QTableWidget的使用方式

dalao的博客http://blog.csdn.net/comwise/article/details/51544939



tip12 Qt中文字码的问题

另一个大坑。。。一输入中文,显示的就是乱码

关于详细的原理可以参考这个:http://blog.csdn.net/tju355/article/details/7253133

我最后是这样做的:

找到主函数,加上中间那行加粗的一行代码,亲测可行

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf8"));//solve the encoding problem    Widget w;


    w.show();


    return a.exec();

}


tip13.Qt调试,输出信息:

#include <QDebug>

qDebug()<<某一个变量;

这个在QT中比printfcout都来得方便

 

tip14.Qt 写槽函数

我是用的desiger,直接右键控件,转到槽函数,选择相应的激活操作,然后去写槽函数就行

手写大概是这种格式:connect(timer, SIGNAL(timeout()), this, SLOT(updateTime()));

一篇可以参考的博客http://blog.csdn.net/u013378306/article/details/52431826


tip15widgetMainWindowDialog的选择使用

http://blog.csdn.net/yang_lang/article/details/6688623    这篇博客很棒

我个人是比较习惯用widget


tip16 给各控件加背景图

代码可以餐卡这个:http://blog.csdn.net/liukang325/article/details/44832397   

一个例子:

void Widget::setTitle(){

  another way to set the title image

    QPalette palette;

    ui->Title->setAutoFillBackground(true);

    //titleImage->setStyleSheet("border-image: url(C:\\Users\\Documents\\title.jpg)");

    QPixmap pixmap("C:\\Users\Documents\\TEST_2017\\6.png");

    QPixmap fitpixmap=pixmap.scaled(1024,100, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);

    //problem: not know how to get the height of the background

    palette.setBrush(QPalette::Background,QBrush(fitpixmap));


   // palette.setBrush(QPalette::Background,QBrush(QPixmap("C:\\Users\\Ken\\Documents\\TEST_2017\\6.png")));

    ui->Title->setPalette(palette);

}

designer的话,新建一个qt source设置好前缀之后,加入图片资源,之后在ui设计界面里对应添加即可



tip17 Qt常用布局搭建

可以参考这个:http://blog.csdn.net/fanyun_01/article/details/52172308

我觉得verticallayout用着还蛮顺手,其他的都好难调啊


tip18 关于qt parent参数

 http://devbean.blog.51cto.com/448512/214166/


tip19 QTreeWidget的使用方法

https://jingyan.baidu.com/article/22fe7ced24e7033002617fbe.html

tip20 参考网站

这大概是最有用的经验了:

http://doc.qt.io/qt-5/classes.html这个是qt官方文档真的良心!!感觉没啥找不到的

http://www.kuqin.com/qtdocument/qtimer.html#details这个似乎是上面那个的中文翻译版英文不太习惯的可以看看


完整代码见文章开头





0 0
原创粉丝点击