using BoxLayoutConfig = std::function<void(QBoxLayout*)>;
BoxLayoutConfig withDefaults = [](QBoxLayout*){};
auto verticalLayout(BoxLayoutConfig init, QWidget* childs...) -> QVBoxLayout* {
auto lay = new QVBoxLayout; init(lay);
va_list ap; va_start(ap, childs);
for (QWidget* child = va_arg(ap, QWidget*); child != nullptr; child = va_arg(ap, QWidget*)) {
if (child->isWidgetType())
lay->addWidget(child);
else lay->addItem(reinterpret_cast<QLayoutItem*>(child));
}
va_end(ap);
return lay;
} 改造是失败的,即便成功了运行时开销也太大,不如直接用 UI XML
所以其实 Qt 的 Widgets XML 用的一直就是一种很工程很民科的方法,为了解决这个问题也是很久以后才有了 Quick,其实还是不如 Kotlin 直接用 block 来得优雅。
audiooutput_refactor.zip
8.2 KB
#Cplusplus #Qt 重构的一个示例,实在是重构不下去了,一看 Qt Widgets 的硬编码 layout geometry 就头疼。
Qt5 Widget 的动态调整自适配简直是魔法的,非得按 parent layout 架构器调用时间来算,隐式依赖。
要是顺序和当前调用栈有点出入,widget 信号甚至都不正常。
要是顺序和当前调用栈有点出入,widget 信号甚至都不正常。
/tmp/duangsuse.sock
其实 pomodoro 不是特别难开发,只是有几个状态。 beginWork, pausedBreak, beginBreak initial beginWork 1. beginWork -> beginBreak 2. beginBreak -> pausedBreak 3. pausedBreak -> pausedBreak 4. beginBreak -> beginWork 每个状态的转移都有信号: (1) 可以提示『休息一下吧』 (2)、(3) 可以提示『休息已被中断』 (4) 可以提示『请恢复您的工作』…
来玩些游戏,然后实现了这个吧。
第一个游戏就是很简单的 Qt5 最基本控件特性入门
第二个是 Timer 和跨程序实例存储的使用
第一个游戏就是很简单的 Qt5 最基本控件特性入门
第二个是 Timer 和跨程序实例存储的使用
Functor, function style cast, function style initialization, constexpr, const blocks, noexcept, function style noexcept 🌚
你知道,C++ 里也有 functor 吗?不过 functor 就是效应器的意思,不是某个范畴的范畴。
在网上了解到 C++ 实现 vararg 有三种常用方法,第一种是 C 式的 <cstdarg>,然后是 C++ 正常的 <initializer_list> 调用时就用花括号 initialzer 和 new T[]
和 template expand,就是
你知道,C++ 里也有 functor 吗?不过 functor 就是效应器的意思,不是某个范畴的范畴。
在网上了解到 C++ 实现 vararg 有三种常用方法,第一种是 C 式的 <cstdarg>,然后是 C++ 正常的 <initializer_list> 调用时就用花括号 initialzer 和 new T[]
{} 那个一样写,然后是 template 的高级做法,可以递归展开 template(模板特化)和 template expand,就是
new T[] { args... } 的操作,属于比较元编程的做法。