我正在使用我的Qt程序中的一项功能,您可以选择以个人资料的方式存储应用程序窗口的位置,然后再加载该配置文件。经过一些研究后,我发现QSettings非常方便,可用于存储x,y等UI信息。为了检测窗口,我决定使用XLib。
我非常初学使用Xlib,我发现this代码以递归方式查询任何打开的窗口,从":0.0"开始。在foreach
循环中我执行了这个保存功能:
int x, y;
int xGeo, yGeo;
int width, height, border, depth;
Display *disp = XOpenDisplay(":0.0");
Window rootWin = XDefaultRootWindow(disp);
QList<Window> windows = listXWindowsRecursive(disp, rootWin);
char* name = NULL;
XWindowAttributes* attributes;
foreach(Window win, windows)
{
attributes = new XWindowAttributes;
// Enumerate through all windows
if(XFetchName(disp, win, &name) && name != NULL)
{
if(strcmp(name, "Secondary Window") == 0)
{
Window child;
qDebug() << (name);
XTranslateCoordinates(disp, win, rootWin, 0, 0, &x, &y, &child);
qDebug() << "XC = " << x << " - " << "YC = " << y;
if(XGetGeometry(disp, win, &rootWin, &xGeo, &yGeo, &width, &height, &border, &depth))
qDebug() << "XGeo= " << x - xGeo << " - " << "YGeo= " << y - yGeo;
settings.setValue("secondaryWindow/x", x - xGeo);
settings.setValue("secondaryWindow/y", y - yGeo);
settings.setValue("secondaryWindow/width", width);
settings.setValue("secondaryWindow/height", height);
if(XGetWindowAttributes(disp, win, attributes))
{
qDebug() << "X = " << x - attributes->x << " - " << "Y = " << y - attributes->y;
}
}
}
}
此部分获取X和Y等Qt UI信息,并使用QSettings
首先,我不确定我写的是否是因为these事实而获得窗口的X和Y的正确方法。此外,我不确定我是否正确传递了所需的参数。
第二件事,这是加载函数:
if(settings.contains("secondaryWindow/x") && settings.contains("secondaryWindow/y"))
{
SecondaryWindow* win = new SecondaryWindow;
win->setGeometry(settings.value("secondaryWindow/x").toInt(),
settings.value("secondaryWindow/y").toInt(),
settings.value("secondaryWindow/width").toInt(),
settings.value("secondaryWindow/height").toInt());
win->show();
}
这是一个奇怪的场景,有一个按钮打开辅助窗口(使用new
和show
),工作正常。返回主窗口,单击保存功能,我得到正确的辅助窗口信息。
现在,如果我关闭了辅助窗口,然后点击了加载功能,则辅助窗口在之前的位置正确打开但是再次单击保存功能将告诉我有两个&#34;辅助窗口&#34;实例但第二个实例有X和Y = 0.
关闭窗口&#34;我的意思是使用&#34; X&#34;按钮并使用close()
插槽。是不是窗户没有正确关闭?我已经实现了closeEvent
处理程序:
event->accept();
QWidget::closeEvent(event);
感谢任何帮助,谢谢!