在Qt Creator中的代码折叠(#pragma region)

13
有没有类似于Qt Creator中的显式代码区域折叠的功能?
#pragma region Region_1
void Test() {}
void Test2() {}
void Test3() {}
#pragma endregion Region_1

我能看到逻辑折叠的代码块,但不知道如何显式设置这样的块。我的Qt Creator版本是2.4.1。
7个回答

12

我认为你可以这样做:

重新格式化你的 someclass.cpp 文件。

namespace ns
{
  CClass::CClass() {}
  CClass::~CClass() {}
  void CClass::Test() {}
  void CClass::Test2() {}
  void CClass::Test3() {}
}

例如

namespace ns // construction-destruction
{
  CClass::CClass() {}
  CClass::~CClass() {}
}
namespace ns // test-region
{
  void CClass::Test() {}
  void CClass::Test2() {}
  void CClass::Test3() {}
}

9

目前不支持。

我认为最好使用代码结构化您的代码。像C#中发现的区域在我看来是良好结构和保持可维护性的不良替代品。


谦虚的意见是被征求的意见... 在我看来 - Dave Causey
1
被征求的 = 在这个上下文中表示被请求。只是有点儿傻。我花了一些时间尝试找到类似问题的答案,但是似乎有很多原则性的抵制这种做法。虽然我倾向于同意,但是当重构不是立即可行的选择时,我发现提纲是一个有用的工具,可以分解第三方代码中已有的复杂性。 - Dave Causey
可能是这样。但如果你曾经见过一个大型的C++项目,就会发现有些代码块是绝对必需的,但却无法折叠并影响可读性。例如:静态成员定义和初始化。我的嵌入式代码有很多静态成员,它们都必须在一致的块中进行初始化,但这旁边就是一堵(无法折叠的)文本墙。顺便说一下,它们不能移动到主上下文之外。 - Harry
可能是这样。但如果你曾经见过一个大型的C++项目,就会发现有一些代码块是绝对必需的,但却无法折叠并且影响可读性。例如:静态成员的定义和初始化。我的嵌入式代码有很多静态成员,它们都必须在一致的代码块中进行初始化,然而这些代码块却是一堵(无法折叠)的文字墙,位于方法旁边。顺便说一下,它们不能被移到主要上下文之外。 - Harry
@Harry:就我个人而言,如果我发现代码难以阅读,我会通过不同的方式来提高可读性,例如重构使类声明变得更小。此外,我发现在类声明中有一定的顺序非常有帮助,例如首先是常量和静态变量,然后是公共变量。我真正喜欢C++的一件事情是你可以通过添加“public:”来声明可见性,这是一个公共块 - 这引发了一个清晰的结构(与成员单独具有可见性/访问权限声明的语言相反(这就是为什么我在那里使用#regions的原因 :)) - Sebastian Mach
显示剩余6条评论

7
现在我们可以通过以下方法实现这一点: 在你想要折叠的块的前面放置以下定义:
#define FOLDINGSTART {

在该区块之后直接放置:

#define FOLDINGEND }

2
这可能是目前我们所面临的问题的最佳解决方案。唯一的问题是,您必须为每个区域使用唯一的标识符(否则会收到警告)。 - Zciurus

6

您可以将您的代码放在 {} 中,为其名称编写注释。

{ // RegionName 
    void Test() {}
    void Test2() {}
    void Test3() {}
}

我同意这个比其他的好。 - IOviSpot

1
这段内容有些陈旧,我知道,但当我自己搜索解决此问题时,它出现了...
@ATatum_BlurPD在Qt Creator C++折叠区域中说:

I know this is old, but here is what works for me in QT Creator 4.13.3.

  • Make sure 'Display Folding markers' is enabled
    • 'Tools' -> 'Options' -> 'Text Editor' -> 'Display' tab
  • In the '.cpp' or '.h' file you want to add the region to:
    • Add '#pragma region RegionNameHere{'
      • Note the '{' at the end
    • Add '#pragma endregion }'
      • Note the '}' at the end

Some sample code:

#pragma region TIMER:Filter Change Delay {

void CLog_EntryList::init_Timer_FilterChangeDelay()
{
    m_timerFilterChangeDelay.setInterval(5000);
    m_timerFilterChangeDelay.setSingleShot(true);
    connect(&m_timerFilterChangeDelay, &QTimer::timeout, this, &CLog_EntryList::slot_Timer_FilterChangeDelay_Timedout);
}

void CLog_EntryList::slot_Timer_FilterChangeDelay_Start()
{
    if(m_timerFilterChangeDelay.isActive())
        return;
    
    m_timerFilterChangeDelay.setInterval(5000);
    m_timerFilterChangeDelay.setSingleShot(true);
    m_timerFilterChangeDelay.start();
}

void CLog_EntryList::slot_Timer_FilterChangeDelay_Timedout()
{
    
}
#pragma endregion}

我在这里没有足够的声望来发布图像证明,但你可以在这里看到它们。


1
这是一篇老文章,但仍然很实用。为了方便起见,您还可以添加一个代码片段来自动输入代码区域。导航菜单到“首选项/文本编辑器/片段”,选择“文本”组并插入一个新的片段,其触发器=区域和触发器变量=名称,然后在下部分添加以下文本(在“}”后添加一个额外的换行符)。现在,在代码中,您只需键入“region”,片段就会被插入,而编辑器将要求设置区域的“名称”。唯一的缺点是,#pragma region会生成警告,但您可以通过添加以下内容来抑制它:QMAKE_CXXFLAGS_WARN_ON += -Wno-unknown-pragmas 到您的.pro文件中。无论如何,您始终可以用任何您认为更好的东西替换该片段。
#pragma region $name$ {

#pragma endregion }

设置偏好...片段示例图片


0

你可以将你的代码放在 {} 中,并为其命名写一个注释。

这会抛出 "EXPECTED UN-QUALIFIED ID" 错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接