我的主窗口上有一个按钮,允许用户选择要打开的文件。
std::fstream infile;
std::string filename = QFileDialog::getOpenFileName(this, tr("TXT file"), qApp->applicationDirPath (),tr("TXT File (*.txt)")).toStdString();
if (filename.empty())
return;
infile.open(filename, std::fstream:: in | std::fstream::out | std::fstream::app);
if (true) {
//Does stuff with the data
}
infile.close();
这通常正常,我在之前的gui qt应用程序中使用过它。但是,对于此应用程序,主窗口(在其设置时)将其窗口标志设置如下:
setWindowFlags(Qt::FramelessWindowHint| Qt::WindowStaysOnTopHint);
这会产生问题,因为主窗口会尝试始终保持在最顶层(从而阻止打开文件窗口出现)。没有stayontop标志,文件对话框可以正常工作。
有没有办法暂时禁用此标志(所以我可以在单击按钮时禁用,然后在文件对话框完成后重新启用)?
setWindowFlags(Qt::FramelessWindowHint| ~Qt::WindowStaysOnTopHint);
这似乎是最常见的建议解决方案,但对我不起作用。我相信这是因为必须重新创建窗口以更改要注册的窗口标志 - 但是,我相信如果我杀死主窗口,文件对话框也会超出范围?
总之,我试图找到一个解决办法,让主窗口始终位于顶部,除非我在尝试选择要打开的文件时(文件对话框由按钮触发)。
答案 0 :(得分:0)
问题不是标志,而是发出更新窗口位置信号的定时器:
QTimer* timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update_pos()));
timer->start(50);
update_pos函数如下:
void MainWindow::update_pos(){
RECT rect;
if (GetWindowRect(target_window, &rect)) {
SetWindowPos((HWND)this->winId(), HWND_TOPMOST, rect.left, rect.top, 0, 0, SWP_NOSIZE);
} else {
//maybe window was closed
qDebug() << "GetWindowRect failed";
QApplication::quit();
}
}
每当调用update_pos函数时,它都会将主窗口推到顶部(因此在打开的文件对话框上方)。