目录
- 解决碰到的各种QT乱气八糟的问题
- 1.动态库与QT库命名冲突
- 2.多线程相关
- 3.Qt数组访问越界导致无法退出循环
- 4.unsign char\* 和 QString相互转换
- 5.槽函数没有响应
- 6.setProperty无法使用
- 7.vtable
- 8.键盘事件失去响应
- 9.布局添加控件,但是控件没有生效
- 10.加载图片程序崩溃
- 11.一个突然出现又突然消失的错误
- 12.无法添加`QComboBox`或`QCombox*`作为成员变量
- 13.Qt发布的程序输入框无法输入中文
- 14.如何让程序只能打开一次,不让程序重复打开
- 15.Ubuntu sudo 运行qt发布的程序无法使用输入法
- 16.自定义标题栏无法拖出屏幕可视区域
- 17.弹窗的按钮,没有hoverLeave事件
- 18.setGeometry()
- 19.设置父窗口不可点击
- 20.gl.h应该在glew.h后面
- 21.头文件循环包含
- 1.动态库与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.无法添加QComboBox或QCombox*作为成员变量
导致错误原因:成员变量未初始化。
错误描述: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发布的程序输入框无法输入中文
- 可以考虑在发布程序的文件夹下拷贝一份
libfcitxplatforminputcontextplugin.so库; - 执行发布程序需要运行
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.h与QGLWidget
21.头文件循环包含
expected class-name before ‘{’ token { ^