代码之家  ›  专栏  ›  技术社区  ›  Techniquab

在QDockWidget中嵌入本机窗口

  •  0
  • Techniquab  · 技术社区  · 5 年前

    这非常类似于: How to manage separate GUI processes in a Qt application?

    https://gist.github.com/torarnv/c5dfe2d2bc0c089910ce

    问题是dock窗口的大小与它所包装的内容的大小不匹配(有一个边距,它宽约15px,高约40px(示例见图片))。

    from PyQt5 import QtWidgets, QtGui, QtCore
    from PyQt5.QtCore import Qt
    import logging
    
    envent_type_lookup = {v:k for k,v in QtCore.QEvent.__dict__.items() if isinstance(v, int)}
    
    class DockingWindowProxy(QtWidgets.QDockWidget):
        def __init__(self, hwnd,  *args, **kwargs):
            super().__init__(*args, **kwargs)
    
            self.window_wrapper = QtGui.QWindow.fromWinId(hwnd)
            print('fromWinId window size', self.window_wrapper.size())
            self.window_widget = QtWidgets.QWidget.createWindowContainer(self.window_wrapper)
            self.setWindowTitle("Wrapper")
            print('windowContainer widget size', self.window_widget.size())
            self.setWidget(self.window_widget)
            print('dock widget size', self.size())
            self.installEventFilter(self)
    
        def eventFilter(self, obj, ev):
            print(f"{envent_type_lookup[ev.type()]} \t {self.window_wrapper.size()}, {self.window_widget.size()}")
            return False
    
    
    if __name__ == '__main__':
        import win32gui
        logging.basicConfig(level=logging.DEBUG)
        app = QtWidgets.QApplication([])
    
        sample = QtWidgets.QPushButton("Test")
        sample.show()
        print('Original window size', sample.size())
        w = sample.window()
        hwnd = w.winId().__int__()
    
        pw = DockingWindowProxy(hwnd)
        pw.show()
    
        app.exec_()
    
    

    warapping dock widget too big artifacts when resized down

    enter image description here

    以下是控制台打印输出,指示每个组件在不同时间的大小:

    Original window size PyQt5.QtCore.QSize(75, 23)
    fromWinId window size PyQt5.QtCore.QSize(120, 23)
    windowContainer widget size PyQt5.QtCore.QSize(640, 480)
    dock widget size PyQt5.QtCore.QSize(640, 480)
    PlatformSurface      PyQt5.QtCore.QSize(136, 62), PyQt5.QtCore.QSize(640, 480)
    WinIdChange      PyQt5.QtCore.QSize(136, 62), PyQt5.QtCore.QSize(640, 480)
    WindowIconChange     PyQt5.QtCore.QSize(136, 62), PyQt5.QtCore.QSize(640, 480)
    Polish   PyQt5.QtCore.QSize(136, 62), PyQt5.QtCore.QSize(640, 480)
    Move     PyQt5.QtCore.QSize(136, 62), PyQt5.QtCore.QSize(640, 480)
    Resize   PyQt5.QtCore.QSize(136, 62), PyQt5.QtCore.QSize(200, 100)
    Show     PyQt5.QtCore.QSize(200, 100), PyQt5.QtCore.QSize(200, 100)
    CursorChange     PyQt5.QtCore.QSize(200, 100), PyQt5.QtCore.QSize(200, 100)
    ShowToParent     PyQt5.QtCore.QSize(200, 100), PyQt5.QtCore.QSize(200, 100)
    PolishRequest    PyQt5.QtCore.QSize(200, 100), PyQt5.QtCore.QSize(200, 100)
    LayoutRequest    PyQt5.QtCore.QSize(200, 100), PyQt5.QtCore.QSize(200, 100)
    UpdateLater      PyQt5.QtCore.QSize(200, 100), PyQt5.QtCore.QSize(200, 100)
    UpdateRequest    PyQt5.QtCore.QSize(200, 100), PyQt5.QtCore.QSize(200, 100)
    WindowActivate   PyQt5.QtCore.QSize(200, 100), PyQt5.QtCore.QSize(200, 100)
    ActivationChange     PyQt5.QtCore.QSize(200, 100), PyQt5.QtCore.QSize(200, 100)
    InputMethodQuery     PyQt5.QtCore.QSize(200, 100), PyQt5.QtCore.QSize(200, 100)
    ShortcutOverride     PyQt5.QtCore.QSize(200, 100), PyQt5.QtCore.QSize(200, 100)
    KeyPress     PyQt5.QtCore.QSize(200, 100), PyQt5.QtCore.QSize(200, 100)
    WindowDeactivate     PyQt5.QtCore.QSize(200, 100), PyQt5.QtCore.QSize(200, 100)
    ActivationChange     PyQt5.QtCore.QSize(200, 100), PyQt5.QtCore.QSize(200, 100)
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   Techniquab    5 年前

    看起来关键问题是在显示将使用其hwnd的窗口之前设置FramelessWindowHint windowFlag。然后一切都像预期的那样工作。