QT开发过程中自己遇到的问题
1. 2020.3.8 QLineedit 有次透明度设成0 焦点光标始终点不上去 只要透明度稍微设置一下就好 比如rgba(0001)2. 2020.3.19 CT20项目突然vtk所有的reader到一定次数读不出图像 后来把库重新换了就好了 两个项目一模一样 至今未查到原因3.一个Qt库项目使用另外一个Qt库项目(光驱读取模块) 头文件放入include lib dll生成 链接了 还是出现问题 百思不得其解 后来将include里需要的两个头文件 添加到使用项目里 就行了!!! 这个得好好注意下一直觉得编译和链接这块没什么问题的。4.QTextedit和QPlainText SetFont无效 不知道什么鬼 最后还是设置了样式才行,StyleSheet()可以获取样式然后用数字替代。。。有点蠢。5.2020.4.16 ct项目 设置界面提升窗口始终不显示 找了半天 发现代码里把这个控件给hide的 因为原来是new的 需要hide 后来提升了 hide还是遗留在那 找了2小时。。。又是自己犯蠢。6.2020.4.18今天一个提升窗口始终不显示 居然还show到了父类外面 检查后发现 给QWidget设置了不该设置的属性//this-setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); //this-setWindowModality(Qt::WindowModal); 会失去父窗口。7.2020.4.22 妈蛋 头文件总是找不到问题 .\HandleQCharts\HandleQChartsClass.h 写成了 所以找不到项目中的文件这么小的问题找了好久妈蛋。。。8.2020.6.4 今天做tcpserver服务端,代码里调的好好的,把程序注册成服务始终执行不到 server newconnect得槽函数 我在前面加了判断 socket!NULL 就返回。 构造函数没有使之NULL 所以一开始那个判断就进不去。那我就纳闷了调试环境下没有问题到了注册成服务就有问题了可能发布和调试优化有关。不过说到底还是自己不小心谨慎点就没有这个问题了。9.2020.6.16拖动窗口事件本来以为鼠标太快 movemouseEvent 不触发导致 鼠标老移出窗口后来发现是在moveEvent函数中加了不应该加的判断 移动的时候判断了按住拖动的那个QWidget是否contain那个坐标Qt做拖动没什么问题 是自己没想好这种事件交错的东西用qt来完成要思考好。10. 程序 窗口构造时resizeEvent获取不到布局内空间大小 可以在showEvent获取到正确大小。11.2020.7.14 自己封装的那个圆形环状控件在设计师里提升后在设计师里他的任何父窗口只要写一点qss哪怕是注释立马就会导致其内部用QPattle上色的QLabel失效然后我在设置字体之后写一遍qss才有效或者用雨田哥的延时触发下就行了这倒是个好办法可以在在构造函数执行完执行函数。本人猜测还是qss和QPattLe执行顺序的问题。我封装的控件都是QPattel 方便传参但是混用会有一些问题找出解决就行了。12.2020.8.19 string str target_ip.toStdString();char *szDestIP const_castchar*(str.c_str()); 这个必须分段写如果直接char *szDestIP const_castchar*(target_ip.toStdString().c_str());临时变量会销毁 szDestIP会指向空。13.2020.10.14 今天碰到一个链接的问题Qt主程序用debug编译一个库用rlease编译那个库引用的QSvg库采用release编译按理说exe目录需要链接一个QSvg和QSvgd(外部项目用到)结果只链接个QSvgd居然也行说明那个用QSvg编译的库在exe目录下能自动链接QSvgd。。。。很奇怪按理说名字不会会直接提示缺少的。。。14.今天解决了个窗口抖动的bug而且原因至今解释的不好之前常规方法用mousepress记录相对坐标moveEvent将主窗口移动到本来坐标加上moveEvent获取到的坐标和记录坐标的偏移量这种做法大体可以但是会出现抖动的情况正确应该使用全局坐标而且如果不记开始位置也不对直接贴下正确用法吧之后补原因。QPoint m_point; QPoint windowTopLeftPoint; bool m_bPressed; void CTitleBarWidget::mousePressEvent(QMouseEvent* evt) { if (NULL ! evt) { //全局坐标 m_point evt-globalPos(); windowTopLeftPoint this-parentWidget()- frameGeometry().topLeft(); } m_bPressed true; } void CTitleBarWidget::mouseMoveEvent(QMouseEvent* evt) { if (NULL ! evt m_bPressed Qt::LeftButton evt-buttons()) { emit signalSetWidgetNormal(); QWidget* parent parentWidget(); if (NULL ! parent) { //获取父窗口全局坐标 QPoint point parent-pos(); ////父窗口原点位移量 但是错误 //int tar_x point.x() evt-globalX() - m_point.x(); //int tar_y point.y() evt-globalY() - m_point.y(); //parent-move(tar_x,tar_y); //qDebug() offset: evt-globalX() - m_point.x() --- evt-globalY() - m_point.y(); //qDebug() origin m_point.x() m_point.y(); //qDebug() now evt-globalX() evt-globalY(); QPoint distance evt-globalPos() - m_point; //QPoint distance event-pos() - mouseStartPoint; //改变窗口的位置 parent-move(windowTopLeftPoint distance); } } }15. 2020.10.20 今天遇到一个控件样式怎么都不生效这个控件继承自Widget然后我直接setstylesheet 发现无论如何都不起作用索性在他内部包了widget才起作用总结:自定义的类以后必须不能直接设置样式而应该在其内部加widget操作自定义的作用只是封装一层管理。billfish16.在paintEvent加update可能会导致cpu急剧上升解决的办法是在应该快速刷新的时候用定时器加速刷新。定时器槽函数里update 不刷新的时候关闭定时器即可。17.拥有Q_Object宏定义的类 不能写在cpp里18 2020.11.18 今天QDialog的一个子类无法响应 keypressevent 中回车键后来找到原因是焦点切在了 窗口中关闭按钮上点击回车可能就是直接执行了关闭按钮。19 c问题 const结尾修饰的函数中所有函数也要用const结尾修饰20.今天要做个qt底部弹窗弹在桌面最左边我想着一个程序怎么有两个弹窗肯定要另外开exe然后进程通信。。。犯傻了一个程序开两个弹窗只要不指定父类就可以的。。。。21.QCombox 设置样式要加下下面第一句话下面列子很万能可以参考ui-btn_combox_proxy_type-setView(new QListView()); QString combox_style QComboBox{border:1px solid;border-color:rgba(255,255,255,50);border-radius:4px;background-color:rgba(43,43,43,255);color: BFTextColorGet(2).name(QColor::HexArgb) ;} QComboBox QAbstractItemView{border: 1px;outline:0px;selection-background-color:rgba(120,120,120,255);height:150px;background-color:rgba(94,94,94,255);font:14px;color: BFTextColorGet(2).name(QColor::HexArgb) ;border-radius: 4px;} QComboBox QAbstractItemView::item{min-height: 30px;width:120;background-color:rgba(94,94,94,255);} QComboBox QAbstractItemView::item:selected{background-color:rgba(255,255,255,50);} QComboBox::drop-down{width: 24px;border-left:1px solid;border-color:rgba(255,255,255,50)} //下拉箭头区域样式 QComboBox::down-arrow{width:8px;height:8px; BFGetResourcePath(commom_icon_down.svg);22.找个combox的滚动条上下样式找了半天 原来是设置QScrollBar::add-line:vertical,QScrollBar::sub-line:vertical{height:0px;}才有效QScrollBar::up-arrow没什么用。23.做类似eagle气泡框 想让窗体在任务栏不显示24.所以说我认为 外部- model-内置数据指针 而不要外部直接调用,要用model的data和setdata。结构需要好好想想25.QDialog困扰我许久今天做一个总结1.有父类的情况下无边框需要这么设置 不加Qt::Dialog直接显示不出来 dia new QDialog(this); dia-setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); 2.无父类 随便你怎么玩26.一个继承自QWidget的窗口设置样式表没有用要在paintEvent加下面的话void paintEvent(QPaintEvent*event) { QStyleOption opt; opt.init(this); QPainter p(this); style()-drawPrimitive(QStyle::PE_Widget, opt, p, this); }我做了两年c/Qt都没发现这个常见问题有点惭愧为什么会没发现因为我往往会在这个窗体内部嵌一个wid_main这样的纯QWidegt,这个直接避开了这个问题补充下是子类窗口不是顶级窗口27.今天碰到了问题公司长嘴鱼项目用QSplitter分成三列中间一列QStackWidget且页面其中一个函数大图预览就是隐藏左右两列中间拉伸。复原则是左右两列show然后中间切换回去导致中间列外部大小对内部控件大小始终不对。最后加了QApplication::processEvents()处理了未处理的事件才恢复目前仍然十分不解就是这种可能循环达不到预期的情况下这种方式需要尝试QApplication::processEvents();void BFMainWin::slot_ThumbnailShow() { if (m_bisFullScreeen) { //根据标签页的状态恢复左右侧栏 if (m_bisLabelPage) { ui-wid_left-show(); ui-wid_right-hide(); } else { ui-wid_left-show(); ui-wid_right-show(); //!!关键 QApplication::processEvents(); } m_left_win-showStackedWidgetByType(Thumbnail_Show_Type); m_middle_win-showStackedWidgetByType(Thumbnail_Show_Type); //QApplication::processEvents(); m_bisFullScreeen false; } }28.一个Qt的菜单项的问题今天项目:代号BF客户端一个ui的菜单项信号怎么都连接不过去。。。。。发现这个菜单项用了5个QListWidget 5个委托以及5个QListWidget来弄给外面的接口是主菜单主菜单里有其他四个菜单的指针其中一个菜单委托发信号怎么都触发不了槽函数后来才知道这种结构最好还是用主菜单的四个菜单指针来实现特例化不过这个结构依然据有可参考性可以作为Qt客户端的一项标准方案还算可行。29.2021.7.28在做项目的时候主窗体BFMainWin加了遮罩层后来有一个重命名窗体是每次执行的时候SetParent设置父窗体 发现怎么都在遮罩层之下。后来在构造函数中设置父窗体就解决了这个问题我估计还是设置父窗体得先后问题不管怎么样遮罩都可以用这个剑鱼项目来进行参照。30.Qt顶级窗口设置qss圆角无效只能paint画背景圆角矩形这个时候因为本身的bug画出来经常偏移最好还是包一层顶级QWidget弄内部窗口的圆角。31.拉新分支0之前要fetch取信息。32.让QLabel中某段文字变颜色只需要用font color#FF1B90FB /font套即可 ,记住 color后面是 不是: 这里吃过亏找了很长时间Bug。33.一个QDialog中的QWidget构造函数设置了一次样式表第二次设置无论如何都无效气死了最后找到并使用了清空样式表的函数才有用void CPopupDialog::SetMainWidStyleSheet(QString win_style_str) {m_wid_main-style()-unpolish(m_wid_main);m_wid_main-style()-polish(m_wid_main);m_wid_main-setStyleSheet(win_style_str);this-update();}34.QT模型视图框架 model里data存指针的时候如果存的是子类,拿的时候也要拿子类类型需要一致存的时候如果是子类拿的时候拿成父类,指针会为空存拿这里如果存的时候用dataItem拿的时候Idataitem就会为空35.C语言项目中malloc之后没有分配内存 反而是memset之后分配了较大的内存,搜了下下面的例子可能合理。.36.用户电脑心电辅助系统32缺少系统库vcomp140.dll32位程序我直接复制system32的vcomp140过去结果启动不了。复制syswow64的过去就行了。