我正在尝试在Windows上的Qt应用程序中嵌入一个GVim窗口,方法是获取QWidget
的{{3}}并使用winId
将其传递给Vim。
我有两个问题:
实际的Vim窗口只能有一定的大小(因为它有一个整数列和行),所以它会小于嵌入它的QWidget。如何获得允许的(字体相关的)大小,以便我可以相应地调整QWidget的大小?
Vim的大小调整仍处于活动状态,并且在QWidget中调整Vim 的大小,当然不会改变QWidget的大小。如何防止这种情况并禁用Vim调整大小?
编辑:我正在尝试将Vim窗口与PDF查看器捆绑在一起以用作LaTeX预览器
答案 0 :(得分:1)
要嵌入外部应用程序,首先要从窗口中删除样式,然后才重新显示它:
void CWinSystemTools::reparentWindow(HWND hWindow, QWidget *widget)
{
if (hWindow == 0)
return;
DWORD style = GetWindowLong(hWindow, GWL_STYLE);
style = style & ~(WS_POPUP);
style = style & ~(WS_OVERLAPPEDWINDOW);
style = style | WS_CHILD;
SetWindowLong(hWindow, GWL_STYLE, style);
SetParent(hWindow, widget->winId());
}
现在,要正确维护调整大小,请执行resize事件:
void TrVisApp::resizeEvent(QResizeEvent *event)
{
resizeClients();
}
并进一步:
void TrVisApp::resizeClients()
{
if (hWndGvim != 0)
CWinSystemTools::resizeWindowToWidget(hWndGvim, ui.wdgGvim->geometry());
}
其中:
void CWinSystemTools::resizeWindowToWidget(HWND hWnd, QRect geometry, bool moveToTopLeftCorner = true)
{
int x = geometry.left();
int y = geometry.top();
if (moveToTopLeftCorner)
{
x = 0;
y = 0;
}
int width = geometry.width();
int height = geometry.height();
SetWindowPos(hWnd, HWND_TOP, x, y, width, height, SWP_NOACTIVATE);
}
很适合我:)