如何将可折叠元素(Qmenu,Qcombobox)渲染到使用QT的位图缓冲液
How can collapsible elements (QMenu, QComboBox) be rendered to a bitmap buffer with Qt?
在qt中,有多种方法可以将qwidgets渲染为位图缓冲区(例如qimage)这些方法可以是:
QWidget.render(QPainter, ...)
QWidget.grab()
QPixmap::grabWidget(QWidget)
QPixmap::grabWindow( ID )
可能有很多变体。但是,它们似乎都没有产生可折叠的元素,例如(子)菜单或组合。
我也发现了QT中的一个BugReport,可能与之相关qtbug-10683(如果这个错误)
因此,如何将诸如扩展的Qcombobox或Qmenu之类的元素渲染到qimage或任何其他位图形式(例如字节阵列)。它应该用于渲染不可见的外屏幕内容,因此不是通过OS捕获当前桌面的。我为所有提示感到高兴,不在乎它是C ,Python还是仅说明这里发生的事情的单词。
好吧,问题:弹出窗口是独立的窗口。
您可以迭代孩子并捕获所有儿童窗户。然后将它们融合到最终图像或仅放入列表中。
要查找小部件是否是独立的窗口,您可以使用iswindow函数。
要捕获隐藏的UI元素,您可以使用QT元系统:
void captureHiddenItems(QWidget* widget, QList<QImage>& list) {
if(auto* comboBox = qobject_cast<QComboBox*>(widget)) {
comboBox->showPopup();
captureChildWindows(comboBox, list);
comboBox->hidePopup();
} else if(auto* menubar = qobject_cast<QMenuBar*>(widget) ) {
capturePopUpMenus(menubar->actions(), list);
}
}
void capturePopUpMenus(QList<QAction*> actions, QList<QImage>& list) {
for(auto* action : actions) {
if(auto* menu = action->menu()) {
captureWidget(menu, list);
capturePopUpMenus(menu->actions(), list);
}
}
}
相关文章:
- Qt VTK交互风格的信号到小部件
- QT在错误的班级中寻找空位
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 如何在Qt C++中更改光标
- 如何在MS Visual Studio 2019中运行QT UI
- QT通过C++添加映射QML项目
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- Qt双缓冲行为
- Qt 帧缓冲对象甚至不渲染顶点
- Qt有循环缓冲吗?
- Qt OpenGL帧缓冲在一台PC上创建,但在另一台PC上失败
- 捕获到缓冲 QT
- 如何将可折叠元素(Qmenu,Qcombobox)渲染到使用QT的位图缓冲液
- 在跨HTTP的协议缓冲序列化中,空格使用QT
- 什么是Qt帧缓冲工作机制
- 我如何渲染地形使用顶点缓冲对象在Qt
- OpenGL顶点缓冲对象上的窗口-如何运行它?qt窗口