Qt 开发FAQ

1. Qt 依赖包地址配置

image-20250910104402079

image-20250910104441257

2. 报对某文件的访问被拒绝

bash
>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppClean.targets(76,5): warning : 对路径“d:\project\xxx\bin\debug_x86\xxx.exe”的访问被拒绝。

这个错误提示在 Qt 项目编译过程中很常见,通常是由于目标文件被占用或权限不足导致的。

  • 关闭正在运行的程序

  • 检查文件权限

    • 右键xxx.exe文件,选择 "属性"

    • 切换到 "安全" 选项卡,确保当前用户有 "修改" 和 "写入" 权限

  • 清理并重建项目

  • 以管理员身份运行

  • 检查是否被其他程序占用

  • 修改输出目录权限

    • 右键debug_x86文件夹,选择 "属性"

    • 在 "安全" 选项卡中给当前用户添加完全控制权限

3. visualStudio 添加新的.cpp 和 .h 文件时,需要在工作空间点击菜单添加,或修改项目下的 .vcxproj 文件添加

  • visualStudio 添加

image-20250911104306587

  • .vcxproj 文件添加

image-20250911104537406

image-20250911104557661

  • .vcxproj.filters 添加

image-20250911110558755

image-20250911110626492

⚠️不添加会报这个错误:

tex
错误 LNK2019 无法解析的外部符号 "public: __thiscall AudioMeter::AudioMeter(class QWidget *)" (??0AudioMeter@@QAE@PAVQWidget@@@Z),该符号在函数 "public: __thiscall MainWindow::MainWindow(class QWidget *)" (??0MainWindow@@QAE@PAVQWidget@@@Z) 中被引用 uai_clinical_aid

关于 qt 里 margin 的方向写法

setContentsMargins 为例

c++
mainLayout->setContentsMargins(16,40, 16, 24);

方向依次为:(left, top, right, bottom)

css 里的 (top, right, bottom, left) 不同

QBoxVLayout 和 QBoxHLayout 中使用 addStretch() 的时机问题

元素集中在底部的原因是在添加任何实际控件之前,就在垂直主布局 v_main_layout中先添加了一个拉伸项 (addStretch())。这会占据所有可用空间,把后续内容都“推”到底部。

image-20250915161453088

如何修复

要让元素从顶部开始排列,你有两个主要方法:

  1. 移除先前的拉伸:将 v_main_layout->addStretch();这行代码移动到你所有需要顶部对齐的控件都添加到布局之后
  2. 使用对齐方式:确保设置了布局的整体对齐方式为 Qt::AlignTop,但这通常需要与正确的拉伸项位置配合使用。

修改后的代码片段可能如下:

// ... (play_panel 的初始化代码不变)

// 添加一个垂直主 layout
QVBoxLayout* v_main_layout = new QVBoxLayout(play_panel);
v_main_layout->setContentsMargins(16, 16, 16, 16);
v_main_layout->setSpacing(10);
// 设置元素顶部对齐 【setAlignment 的作用是设置布局内控件整体的对齐方式,但需与拉伸因子配合】
v_main_layout->setAlignment(Qt::AlignTop); // 先保留着,但核心问题不在这

// 先添加你的实际内容(例如 h_line1_layout)
QHBoxLayout* h_line1_layout = new QHBoxLayout();
// ... 设置 h_line1_layout 的属性 (spacing, alignment 等) ...
// ... 向 h_line1_layout 添加 lb_recording 和 audioControlBar ...
v_main_layout->addLayout(h_line1_layout); // 先把内容布局加进去

// !然后!再添加拉伸,这样拉伸会占据剩余空间,将之前的内容推向顶部
v_main_layout->addStretch();

// ... (可能还有其他要添加到 v_main_layout 的内容,都应加在 addStretch() 之前)

// dialog 默认不显示
play_panel->hide();

关键修改说明:

  • 调整了 addStretch()的位置:在所有你希望被“顶”到顶部的内容之后再添加拉伸项。这样,拉伸项会填满剩余空间,从而确保之前添加的控件集中在布局顶部。
  • v_main_layout->setAlignment(Qt::AlignTop);这行代码保留了,它对布局内控件的整体对齐方式有影响,但解决这个特定问题的核心是调整拉伸项的位置。

Qt 布局技巧

  • addStretch()的位置至关重要:在添加控件之前调用 addStretch(),它会在控件上方(或左侧,对于 QHBoxLayout)创建弹性空间;在添加控件之后调用,则空间会在控件下方(或右侧)。🚯这个特性确实要慎用,用对时机和位置很重要
  • setAlignment:用于设置布局内控件整体的对齐方式(如所有控件都左对齐、顶部对齐),或者通过 setAlignment(widget, alignment)设置特定控件在布局单元格内的对齐方式。但它通常无法克服由拉伸项或大小策略决定的整体布局分配。

QWidget 设置背景颜色时,需启用此特性,否则设置不会生效

c++
    this->setObjectName("AudioStatusBar")
    this->setAttribute(Qt::WA_StyledBackground, true);
    this->setAutoFillBackground(true); // 需启用,否则定义 widget 的背景色不生效
    this->setStyleSheet(R"(
        QWidget#AudioStatusBar {
            background-color: #F4F4F4;
        }
    )");

控件触发 hover 事件

控件触发 hover 效果,需要结合 QAction 使用, QPushButton 不支持 QAction, 只有 QToolButton 支持 QAction

Qt 中给控件添加阴影效果的实战技巧

参考资料: Qt 给顶层窗口和子控件添加阴影和圆角

TL:DR

顶层窗口的背景定死了,没办法在窗口之外的位置显示UI效果。技巧是将顶层窗口设为透明,然后在顶层窗口内部最外层设置一个 shaowWidget ,内部的这个 widget 可以使用 QGraphicsDropShadowEffect 绘制阴影效果。shaowWidget 和 顶层 widget 之间一定要预留一些边距,因为超出顶层控件的范围是不会显示任何效果的。

要实现比较自然的阴影效果, 那么 shdowWidget 和 顶层窗口之间的间距要保证不要小于阴影的模糊半径,不然这个阴影效果会有种突然被截断的感觉,不是那么自然。

比如这个明显看到有一圈边沿

image-20250919104440057

这个就自然很多

image-20250919104603149

CC BY-NC-SA 4.0 乙巳 © 闻 · 斋