存档在 2014年12月

“GLdouble”: 重定义;不同的基类型

2014年12月30日

D:\Qt\Qt5.2.1\5.2.1\msvc2012\include\QtGui\qopengl.h中
# ifndef GLdouble
//typedef GLfloat GLdouble;
# endif

gvim,wineqq等软件不能输入中文解决办法

2014年12月29日

在linux下,有许多软件比如gvim,wineqq都不能使用中文输入法,可以通过如下配置来解决。
etc/profile下添加:

XMODIFIERS="@im=fcitx"
XIM="fcitx"
GTK_IM_MODULE="xim"
QT_IM_MODULE="xim"

linux,sougou输入法黑框

2014年12月29日

是由于渲染原因,导致透明输入框不透明。
解决办法

apt-get install compton

为了每次开机后都能自动执行,可以在/etc/rc.local或者/etc/profile中添加
compton -b

Linux下Qt链接MySql折腾

2014年12月29日

最近的项目想在Linux下来做,但是数据库这块有一些问题,浪费了好几个小时,记录在此备忘一下。

    1.QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QPSQL QPSQL7
    提示驱动没有加载,应该是链接库出问题,进入Qt的数据库插件目录

    cd /usr/local/Qt5.2.1/5.2.1/gcc/plugins/sqldrivers/

    查看当前Qt处理mysql的动态链接库依赖的动态连接库
    [sjell]ldd libqsqlmysql.so [/shell]
    会发现如下的信息,你会发现有一行结尾是 “not found”

           linux-vdso.so.1 =>  (0x00007fff457d9000)
            libmysqlclient_r.so.16 => not found
    	linux-gate.so.1 =>  (0xb771f000)
    	libQt5Sql.so.5 => /usr/local/Qt5.2.1/5.2.1/gcc/lib/libQt5Sql.so.5 (0xb76cc000)
    	libQt5Core.so.5 => /usr/local/Qt5.2.1/5.2.1/gcc/lib/libQt5Core.so.5 (0xb6ebe000)
    	libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb6dd5000)
    	libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6c26000)
    	libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb6c0c000)
    	libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb6c06000)
    	libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb6bea000)
    	libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb6ba4000)
    	libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb6b87000)
    	libicui18n.so.51 => /usr/local/Qt5.2.1/5.2.1/gcc/lib/libicui18n.so.51 (0xb6965000)
    	libicuuc.so.51 => /usr/local/Qt5.2.1/5.2.1/gcc/lib/libicuuc.so.51 (0xb67eb000)
    	libgthread-2.0.so.0 => /usr/lib/i386-linux-gnu/libgthread-2.0.so.0 (0xb67e8000)
    	librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb67df000)
    	libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xb66d3000)
    	/lib/ld-linux.so.2 (0xb7720000)
    	libicudata.so.51 => /usr/local/Qt5.2.1/5.2.1/gcc/lib/libicudata.so.51 (0xb518a000)
    	libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xb514b000)
    

    找到qt中数据库的源代码目录,我的在
    /usr/local/share/qt-everywhere-opensource-src-5.2.1/qtbase/src/plugins/sqldrivers/mysql

    qmake && make 

    会生成几个文件,拷贝到/usr/local/Qt5.2.1/5.2.1/gcc/plugins/sqldrivers/后再ldd发现已经没有上面的问题。

  • 2.数据库不能连接
  • 我采用如下的代码来测试数据库联通性,一方面可以测试联通与否,还可以打印出错原因。

    #include <QCoreApplication>
    #include <QtSql>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
        db.setHostName("localhost");
        db.setDatabaseName("mysql");
        db.setUserName("root");
        db.setPassword("1234");
    	qDebug() << "Available drivers:";
    	QStringList drivers = QSqlDatabase::drivers();
    	 foreach(QString driver, drivers) qDebug() << "\t" << driver;
        bool ok = db.open();
        qDebug() << ok<<endl;
    	qDebug()<<db.lastError()<<endl;
        db.close();
        return a.exec();
    }
    

    但是出现以下原因:

    QSqlError(2002, "QMYSQL: Unable to connect", "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'(2)") 

    使用

    ps -aux | grep mysql

    找到mysql然后kill掉。我是采用这种方法解决Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’错误。

  • 3.环境变量设置
  • 需要正确的设置环境变量,我的环境变量如下:
    profile.tar

Linux下designer/linguist菜单不能显示中文解决

2014年12月29日

在使用Qt源代码编译的designer,linguist等工具使用时会有菜单不能显示中文的现象,但是qtcreator还是能够显示中文的。
解决办法就是不用使用源代码编译安装,而是使用官方发放的二进制bin文件安装即可解决。
比如:
qt-opensource-linux-x86-5.2.1.run
qt-opensource-linux-x86-5.4.0.run

教你如何在Linux下使用虚拟串口调试

2014年12月22日
  • 1.虚拟串口
  • 虚拟串口的方法采用python创建两个从设备,并读取他们的数据进行转发,代码如下:

    #! /usr/bin/env python
    #coding=utf-8
    import pty
    import os
    import select
    def mkpty():
        master1, slave = pty.openpty()
        slaveName1 = os.ttyname(slave)
        master2, slave = pty.openpty()
        slaveName2 = os.ttyname(slave)
        print '\nslave device names: ', slaveName1, slaveName2
        return master1, master2
    if __name__ == "__main__":
        master1, master2 = mkpty()
        while True:
            rl, wl, el = select.select([master1,master2], [], [], 1)
            for master in rl:
                data = os.read(master, 128)
                print "read %d data." % len(data)
                if master==master1:
                    os.write(master2, data)
                else:
                    os.write(master1, data)

    下载链接,点击这里virtualcom.py.tar
    代码还是算比较简单,使用select来检测数据可读事件,并读取数据,转发到另外的虚拟设备。

  • 2.串口调试方法1
  • 这种方法使用极其简单,可以使用cat /etc/pts/11,这样就会打开该设备并阻塞,直到收到数据。
    发送数据方法也很简单,直接 echo “123” >> /etc/pts/12,即可。

  • 3.串口调试方法2
  • 这种方法使用Linux下的串口调试助手,xgcom,在goolecode可以下载到源码,另外还需要安装一些依赖包

    apt-get install make  automake libglib2.0-dev  libvte-dev  libgtk2.0-dev

    安装也很简单

    ./autogen.sh
    make && make install
    xgcom

    分别开两个xgcom,设备名字分别填上第一步里虚拟出的串口设备,然后进行通信测试。

后记:在windows下有非常好用的VSPD使用,当然在Linux下也是有这个软件的Linux版本,只是说配置文件很繁琐,没时间去折腾,感兴趣的可以搜索“VSPD for linux”。

Qt添加C++0x支持

2014年12月19日

在工程文件(pro)中加入下面这段话就OK了:

QMAKE_CXXFLAGS += -std=c++0x

Linux:“GL/gl.h:No such file or directory”

2014年12月17日

编译第一个工程的时候出现了如下错误:“GL/gl.h:No such file or directory”,这是由于系统中没有安装OpenGL库导致的,于是在控制台中输入以下命令安装OpenGL库及其工具:apt-get install libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev 即可。