1.qt开发中,想要主界面全屏,其他界面可以在主界面之上显示:
这个如果是全部用QWidget开发的应该有很多办法可以实现,但是如果用的QOpenGLWidget做的主界面,就会出现其他界面无法占有上层的现象,这里需要使用QWindowsWindowFunctions::setHasBorderInFullScreen(tlwWindow->windowHandle(), true);
来解决,官方问题方案:https://doc.qt.io/qt-5/windows-issues.html#fullscreen-opengl-based-windows。
2.想要获取同一个QTreeWidgetItem中的控件:
比如QTreeWidgetItem中添加了一个combobox和一个button,那么可以通过:combox->setProperty("item", QVariant::fromValue((void*)item));
给combobox设置属性,再通过:QComboBox* combo = qobject_cast<QComboBox*>(sender());
获取到当前操作的combobox,然后:QTreeWidgetItem* item = (QTreeWidgetItem*)(combo->property("item")).value<void*>();
就可以拿到对应的QTreeWidgetItem了。
那么怎么拿到其他控件呢,可以把每个控件添加到item属性中:item->setData(2, Qt::UserRole + 1, QVariant::fromValue(combox));
这样就可以通过item的data拿到对应的控件了:QComboBox* cbx = item->data(2, Qt::UserRole + 1).value<QComboBox*>();
其他同样操作即可,但是Qt::UserRole + 1需要不同。
3.
(1)mqtt可以同时订阅多个主题,这样不同主题发送的消息就可以同时处理了。
(2)mqtt的pulish函数发送QByteArray,但是如果是自定义的数据类型就不能通过简单的转换发送,否则会改变数据,比如自定义一个结构体,里面有QString类型,这就需要使用QDataStream来进行转换,关键点就是重写QDataStream &operator<<
和QDataStream &operator>>
,用来转换自定义数据类型。参考:https://blog.csdn.net/wangyeqiang/article/details/8272912
4.QDomDocument读写xml:
读写过程倒是很多方法,但是修改节点就会遇到一个小问题,需要将修改的节点replace掉,就是可以将要修改的节点获取为oldnode,修改之后赋值给newnode,再通过replace修改。另一个小问题,QDomNode的nodeValue()为空,这里需要使用node.firstChild().nodeValue(),其中隐藏了一个text的子节点。参考:https://www.dazhuanlan.com/emedigqq/topics/949790
5.如果添加到layout中的控件叠加了,可以试试layout->**setSizeConstraint(QLayout::SetFixedSize)**
;
6.form->setAttribute(Qt::WA_DeleteOnClose);
可以让你new出来的widget在点击x号关闭时被删除释放,否则可能只是隐藏了。
7.如果添加到控件中的图像被切割,可以进行缩放:QPixmap scaledPixmap = pixmap.scaled(this->canvas->maximumSize(), Qt::KeepAspectRatio);