Python 如何使用Qt将可折叠元素(QMenu、QComboBox)渲染到位图缓冲区?
在Qt中,有多种方法可以将QWidget呈现到位图缓冲区(例如QImage) 这些方法可以是:Python 如何使用Qt将可折叠元素(QMenu、QComboBox)渲染到位图缓冲区?,python,c++,qt,bitmap,Python,C++,Qt,Bitmap,在Qt中,有多种方法可以将QWidget呈现到位图缓冲区(例如QImage) 这些方法可以是: QWidget.render(QPainter, ...) QWidget.grab() QPixmap::grabWidget(QWidget) QPixmap::grabWindow( ID ) 可能有很多变体。但是,它们似乎都不会呈现(子)菜单或组合框之类的可折叠元素 我还在Qt中发现了一个可能与之相关的错误报告 (如果这是一个bug的话) 那么,如何将扩展的QComboBox或QMenu等元
QWidget.render(QPainter, ...)
QWidget.grab()
QPixmap::grabWidget(QWidget)
QPixmap::grabWindow( ID )
可能有很多变体。但是,它们似乎都不会呈现(子)菜单或组合框之类的可折叠元素
我还在Qt中发现了一个可能与之相关的错误报告
(如果这是一个bug的话)
那么,如何将扩展的QComboBox或QMenu等元素渲染为QImage或任何其他位图形式(如字节数组)。它应该用于呈现不可见的屏幕外内容,因此通过操作系统捕获当前桌面不是一个选项。我对所有的提示都很满意,不管它是C++、Python还是仅仅解释这里发生的事情。 < P>这里的问题是:弹出窗口是独立窗口。 您可以迭代子窗口并捕获所有子窗口。然后将它们混合到最终的图像中,或者直接放入列表中 若要查找小部件是否为独立窗口,可以使用函数 要捕获隐藏的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);
}
}
}
void captureHiddenItems(QWidget*小部件、QList和list){
if(自动*组合框=qobject_cast(小部件)){
组合框->显示弹出窗口();
captureChildWindows(组合框,列表);
组合框->hidePopup();
}else if(自动*菜单栏=qobject_cast(小部件)){
CapturePopupMenu(菜单栏->操作(),列表);
}
}
无效capturePopUpMenus(QList操作、QList和列表){
用于(自动*动作:动作){
如果(自动*菜单=操作->菜单()){
captureWidget(菜单、列表);
CapturePopupMenu(菜单->操作(),列表);
}
}
}
感谢您迄今为止的帮助-知道如何确定子窗口的正确相对渲染位置吗?““父位置加上父高度”适用于QComboBox,但我想在QMenuBar子菜单中也有一种更优雅的工作方式?