Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用Qt将可折叠元素(QMenu、QComboBox)渲染到位图缓冲区?_Python_C++_Qt_Bitmap - Fatal编程技术网

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

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等元

在Qt中,有多种方法可以将QWidget呈现到位图缓冲区(例如QImage) 这些方法可以是:

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子菜单中也有一种更优雅的工作方式?