【问题标题】:Qt Creator: AlwaysStaysOnTop blocks open file promptQt Creator:AlwaysStaysOnTop 阻止打开文件提示
【发布时间】:2016-04-22 23:57:03
【问题描述】:

我的主窗口上有一个按钮,允许用户选择要打开的文件。

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 应用程序中使用过它。然而,对于这个应用程序,主窗口(根据它的设置)设置它的 windowsflags 如下:

setWindowFlags(Qt::FramelessWindowHint| Qt::WindowStaysOnTopHint);

这会产生一个问题,因为主窗口试图始终保持在顶部(从而阻止打开的文件窗口出现)。如果没有 staysontop 标志,文件对话框将正常工作。

有没有办法暂时禁用此标志(这样我可以在单击按钮时禁用,然后在文件对话框完成时重新启用)?

setWindowFlags(Qt::FramelessWindowHint| ~Qt::WindowStaysOnTopHint);

这似乎是最常见的建议解决方案,但对我不起作用。我相信这是因为必须重新创建窗口才能注册窗口标志的更改 - 但是,我相信如果我杀死主窗口,文件对话框也会超出范围?

总之,我试图找到一种解决方法,让主窗口始终位于顶部,除非我尝试选择要打开的文件(文件对话框由按钮触发)。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    问题不在于标志,而在于发出更新窗口位置的信号的计时器:

    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 函数时,它都会将主窗口推到顶部(因此位于打开文件对话框的上方)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      相关资源
      最近更新 更多