gpt4 book ai didi

python - 如何使用 Qt 将可折叠元素(QMenu、QComboBox)渲染到位图缓冲区?

转载 作者:搜寻专家 更新时间:2023-10-31 02:09:54 25 4
gpt4 key购买 nike

在 Qt 中有多种方法可以将 QWidgets 渲染到位图缓冲区(例如 QImage)这些方法可以是:

QWidget.render(QPainter, ...)
QWidget.grab()
QPixmap::grabWidget(QWidget)
QPixmap::grabWindow( ID )

有很多可能的变体。但是,它们似乎都没有呈现可折叠元素,例如(子)菜单或组合框。

另外我在 Qt 中发现了一个可能与此相关的错误报告 QTBUG-10683 (如果这是一个错误的话)

那么,如何将扩展的 QComboBox 或 QMenu 等元素呈现为 QImage 或任何其他位图形式(如字节数组)。它应该用于渲染不可见的屏幕外内容,因此不能通过操作系统捕获当前桌面。我对所有提示都很满意,不管它是 C++、Python 还是只是解释这里发生的事情的文字。

最佳答案

问题就在这里:弹出窗口是独立的窗口。

您可以迭代子项并捕获所有子 Windows。然后将它们混合成最终图像或仅放入列表中。

要查找小部件是否是独立窗口,您可以使用 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);
}
}
}

关于python - 如何使用 Qt 将可折叠元素(QMenu、QComboBox)渲染到位图缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46025536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com