Qt 疑难杂症

解决碰到的各种QT乱气八糟的问题

1.动态库与QT库命名冲突

/home/robot/Qt5.13.0/5.13.0/gcc_64/include/QtGui/qopenglext.h:8591: error: expected primary-expression before ‘storagetype’ typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components);

解决方法:把相应的行给先注释掉,以后如果不好用,就再把注释去掉

2.多线程相关

* chaerview更新频率太高的话需要`QThread::msleep()`睡一会儿,不然就会导致崩溃<br/>
* `共享资源需要加锁才能访问,不然会出现很奇怪的问题;`该问题修改:尽量使用信号与槽<br/>
* `QProgressBar->setValue(0)莫名奇妙导致程序崩溃?setvalue()之前先加锁,问题解决了。。。`实际就是下面的问题,没有使用信号与槽导致出现一系列问题;
* 成员变量不要关联到其他的类的对象中,想要修改不同线程的成员变量,最好使用信号与槽

3.Qt数组访问越界导致无法退出循环

double *arr = new double[12]();
for (int i=0; i<14 i++){
	double j=arr[i];
}

4.unsign char* 和 QString相互转换

//unsigned cahr* -> QString
unsigned char  *str = "fdd" ;
char *str1 = (char *)str;
QString str2 = QString(QLatin1String(str1));
//QString -> unsigned char *
QString str = "fdd";
QByteArray ba = str.toLatin1();
unsigned char * str1  = (unsigned char *)ba.data;

拷贝自: qt下unsigned char *与QString之间的相互转换.

5.槽函数没有响应

  • 因为相应的对象在死循环中处理事件,所以无法响应;

6.setProperty无法使用

  • 解决方法:#include <QComboBox>

7.vtable

error: undefined reference to 'vtable for xxxx'
原因:在构造函数处出错,头文件没有#include <QWidget>,使用了不完整的类QWidget

class MyLabel : public QLabel{
	Q_OBJECT
public:
    MyLabel(QWidget *parent);
    ~MyLabel();
};
  • qmake 一下,然后运行即可;

8.键盘事件失去响应

原因:界面中有一个QTableWidget,被这个表格抢走了焦点,所以需要设置m_table_info->setFocusPolicy(Qt::NoFocus);,这样表格就无法聚焦了;

9.布局添加控件,但是控件没有生效

QVBoxLayout *v_1 = new QVBoxLayout();
v_1->addWidget(new QLabel());	//必须是指针,&无效 
QLabel x;
v_1->addWidget(&x);	//无效

10.加载图片程序崩溃

void paintEvent(QPaintEvent *e)
{
	QPixmap pix;
	pix.load(":images/xx.png");
}

在load处崩溃。崩溃原因:图片格式有问题,将图片另存为jpg格式的图片,则加载成功。

11.一个突然出现又突然消失的错误

给一个MainWidow了添加了一个Widget类型的成员变量,然后,MainWindow的其中一个QVector成员变量 str_arr,无法访问,只要一访问str_arr[i],程序就会崩溃,但是该vector已经初始化了,然后,将Widget成员变量注释掉,再把注释取消掉,程序又能正常运行了????
错误出现原因:Widget类有继承自BasePage类,BasePage有一个未定义的函数,但是为啥编译的时候没有错误提示呢?

12.无法添加QComboBoxQCombox*作为成员变量

导致错误原因:成员变量未初始化。
错误描述:MyWidget不能添加QCombox类型或者QCombox类型指针的成员变量,只要添加QComboBox相关的成员变量,程序就会崩溃,无法找到错误原因,,调试后发现崩溃的地方在qcolor.h:

#if QT_STRINGVIEW_LEVEL < 2
inline QColor::QColor(const QString& aname)
{ setNamedColor(aname); }
#endif

提示aname无法访问
通过寻找后发现,只要MyWidget的另一个int类型成员变量m_cur_theme被赋值后,程序就不会崩溃。随后我便在构造函数中给该成员变量赋初值,赋初值后,该错误果然不在出现。
总结:成员变量最好在构造函数中初始化,不然会出现难以预料,无法调试,很难找到原因的错误。

13.Qt发布的程序输入框无法输入中文

  1. 可以考虑在发布程序的文件夹下拷贝一份libfcitxplatforminputcontextplugin.so库;
  2. 执行发布程序需要运行test.sh,可以在test.sh中加上一段话,就可以输入中文了
#!/bin/bash
appname=`basename $0 | sed s,\.sh$,,`
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
cd $dirname 
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
export LANG=zh_CN.UTF-8	 	###修改
killall fcitx 										###修改
fcitx &&  $dirname/$appname "$@" ###修改

参考:Input Chinese in Qt5 Program

14.如何让程序只能打开一次,不让程序重复打开

//main.cpp
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QString path = QDir::temp().absoluteFilePath("SingleAppTest.lock");
    // path = C:/Users/yu/AppData/Local/Temp/SingleAppTest.lock
    QLockFile lockFile(path);
    bool isLock = lockFile.isLocked();
    // bool QLockFile::tryLock(int timeout = 0)
    // tryLock尝试创建锁定文件。此函数如果获得锁,则返回true; 否则返回false。
    // 如果另一个进程(或另一个线程)已经创建了锁文件,则此函数将最多等待timeout毫秒
    if (!lockFile.tryLock(100))
    {
        QMessageBox msgBox;
        msgBox.setIcon(QMessageBox::Warning);
        msgBox.setText("The application is already running.\n"
            "Allowed to run only one instance of the application.");
        msgBox.exec();
        return 1;
    }

    MainWindow w;
    w.show();
    return a.exec();
}

15.Ubuntu sudo 运行qt发布的程序无法使用输入法

原因dbus失效,fcitx输入法框架无法使用,暂定解决方法:内嵌输入法
原因分析:
Fcitx cannot be triggered on

16.自定义标题栏无法拖出屏幕可视区域

解决:setWindowFlags(Qt::FramelessWindowHint | Qt::Popup);

17.弹窗的按钮,没有hoverLeave事件

注释掉m_pop_adj->setWindowModality(Qt::ApplicationModal);

18.setGeometry()

如果有父窗口,那么位置就相对于父窗口,如果没有就相当于屏幕;

19.设置父窗口不可点击

创建子窗口时,应该是PopDel *m_popdel = new PopDel()而不是PopDel *m_popdel = new PopDel(this)
然后显示子窗口时,调用该函数:m_pop_del->setWindowModality(Qt::ApplicationModal);

20.gl.h应该在glew.h后面

glew.hQGLWidget

21.头文件循环包含

expected class-name before ‘{’ token { ^


版权声明:本文为a1356467原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。