2017-09-03 2 views
2

Dans Qt, il existe différentes méthodes pour rendre QWidgets à un tampon bitmap (par exemple un QImage) Ces méthodes peuvent être:Comment les éléments pliables (QMenu, QComboBox) peuvent-ils être rendus dans un tampon bitmap avec Qt?

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

Il y a beaucoup de variantes possibles. Cependant, aucun d'entre eux ne semble rendre des éléments pliables comme des (sous-) menus ou des comboboxes.

Aussi je trouve un rapport de bogue dans Qt qui pourrait être lié à ce QTBUG-10683 (si un bug du tout)

Alors, comment peut-éléments comme un QComboBox expansé ou QMenu être rendus à un QImage ou tout autre Forme bitmap comme Byte-Array. Cela devrait fonctionner pour rendre le contenu hors écran invisible, donc la capture du bureau actuel via le système d'exploitation n'est pas une option. Je suis content pour tous les indices, que ce soit en C++, Python ou juste des mots expliquant ce qui se passe ici.

Répondre

2

Eh bien le problème ici: les popups sont des fenêtres autonomes.

Vous pouvez itérer des enfants et capturer toutes les fenêtres enfants. Puis mélangez-les à l'image finale ou mettez-les dans la liste. Pour savoir si le widget est une fenêtre autonome, vous pouvez utiliser la fonction isWindow.

Pour capturer des éléments de l'interface utilisateur cachés que vous pouvez utiliser méta-système 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); 
    } 
    } 
} 
+0

Nous vous remercions de l'aide à ce jour - une idée de déterminer la position de rendu relatif correct des fenêtres de l'enfant? La position du parent plus la hauteur du parent fonctionne pour QComboBox, mais je suppose qu'il y a aussi une façon plus élégante de travailler dans les sous-menus QMenuBar? – thewhiteambit