您的位置:首页 > 编程语言 > Qt开发

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

2017-04-30 23:55 756 查看
完整代码:https://github.com/KenGeng/BookManageSystemForDatabaseProject

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

以下是效果图:




【没有审美QAQ】

具体的代码要等到这学期结束之后再上传了。。。
以下的内容主要总结一下自己踩到的坑和一点点经验,比较杂乱:
tip1:
初学者如果要赶due的话,一定要用Qt designer来画UI 一定要用Qt designer来画UI 一定要用Qt
designer
来画UI!我刚开始参考了网上另一份详细的用Qt和MySQL做图书管理系统的学长(姐)的代码,想直接用代码布局,但尝试了一下午之后,还是选择了用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函数:
QString::compare("a","b");  //值为0;  
QString::compare(“a”,“f");  //值为<0;  
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中比printf和cout都来得方便
 
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这个似乎是上面那个的中文翻译版
英文不太习惯的可以看看

完整代码见文章开头

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: