文章目录
不能向QDockWidget拖入控件

在vs中打开ui文件,通过Qt Designer查看ui文件可以发现,QDockWidget下没有其他控件。因为QDockWidget是容器控件,不能直接拖入子控件,必须通过中间 QWidget承载布局。
解决方法:使用文本编辑器打开ui文件,往里面添加 <widget class="QWidget" name="dockWidgetContents"/>。
修改后的ui文件如下所示:

然后再用Qt Designer打开ui文件,可以看到已经成功往QDockWidget中添加了QWidget,可以往QWidget中拖入控件。

向.ui文件添加控件后,vs语法检测没有更新
解决方法:
- 首先要保存.ui文件
- 右键.ui文件,点击编译

- 右键项目,重新扫描解决方案

参考链接:VS写Qt项目时,ui界面拖拽的控件代码找不到引用的解决办法
新建了继承自QDialog的类,点击确认按钮后界面没有反应
这与第一部分的不能向QDockWidget拖入控件的情况类似,都是因为使用vs开发Qt项目的时候,即使是使用了Qt Visual Studio Tools插件 开发,在很多时候,vs也不支持Qt Designer的默认行为(第一部分中如果是使用Qt Designer创建QDockWidget就不会出现这种情况,因为它默认为我们在QDockWidget中创建了QtWidget)。
在Qt Designer中创建QDialog类,它已经链接好了信号与槽,这时我们不需要再添加额外的代码,点击确认或是取消按钮后,窗口就会自动关闭,并发送执行reject()或是accept()槽函数。

但是,当我们在vs中创建QDialog类,vs的qt插件是不会自动地为我们链接信号与槽。

解决方法: 在创建QDialog类的构造函数中手动地连接信号与槽。
QObject::connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &CreateExpDialog::reject);
QObject::connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &CreateExpDialog::accept);
信号与槽的重复连接和自动连接
QObject::connect(sender, signal, const receiver, method, Qt::ConnectionType)如果进行了重复连接,那么当信号到来时,槽函数就会被重复执行,要想只连接一次ConnectionType应设置成Qt::SingleShotConnection(Qt6)或 Qt::UniqueConnection。而QObject::disconnect(sender, signal, receiver, method)只要一次就能将多次连接过的信号与槽断开。
void on_<object_name>_<signal name>(<signal parameters>);符合此命名规范的函数将会自动地连接信号与槽。这就可能会出现问题:Qt自动生成关联的槽函数,然后自己又用代码手动connect了一次,导致重复绑定。
在头文件中使用类的提前声明而不是直接将类所在的头文件包含进来
减少编译依赖
当修改一个头文件的时候,所有直接或者间接#include它的源文件都需要重新编译。如果头文件中仅用了类的指针/引用(不需要知道类的大小或者成员),应使用类的提前声明。
解决循环依赖问题
两个类相互引用时,#include会导致循环依赖。
Qt子类对象必须和父类对象处在同一个线程
将自定义的类加入到qt的对象树管理中
class A : public QObject, public QGraphicsItem{ //如果是多继承,QObject的继承顺序是第一个
Q_OBJECT
}
vs中出现C4828
在网页中复制代码粘贴到vs中就会出现此警告The file contains a character starting at offset 0x1a9 that is illegal in the current source character set (codepage 65001).当出现中文字符的时候还会报错。出现此问题的文件编码格式都是ANSI

5122

被折叠的 条评论
为什么被折叠?



