【问题标题】:Restoring window position恢复窗口位置
【发布时间】:2012-03-29 19:41:09
【问题描述】:

我正在开发 QT 应用程序,但在从托盘图标恢复窗口时遇到问题。

这是与托盘图标相关的代码:

createActions();
createTrayIcon();
setIcon();

trayIcon->show();

connect(
        trayIcon,
        SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
        this,
        SLOT(trayIconClicked(QSystemTrayIcon::ActivationReason))
       );

创建动作

   open = new QAction(tr("&Open"), this);
   connect(open, SIGNAL(triggered()), this, SLOT(show()));

   close = new QAction(tr("&Quit"), this);
   connect(close, SIGNAL(triggered()),qApp, SLOT(quit()));

 void MainWindow::createTrayIcon()
{
trayIconMenu = new QMenu(this);

trayIconMenu->addAction(open);
trayIconMenu->addSeparator();
trayIconMenu->addAction(close);
trayIcon = new QSystemTrayIcon(this);
trayIcon->setContextMenu(trayIconMenu);


}

void MainWindow::trayIconClicked(QSystemTrayIcon::ActivationReason reason)
{
    if(reason == QSystemTrayIcon::Trigger)
        this->show();
}


void MainWindow::closeEvent(QCloseEvent *event)
{


     QString title = "Smart Typer 2000";
     QString text = "Aplikácia stále beží, obnovíte ju poklepením po ikonke, zrušíte ju stlačením ikonky pravým tlačítkom,"
                        "a následným zvolením možnosti Quit";
    if (trayIcon->isVisible()) {

        trayIcon->showMessage(title,text,QSystemTrayIcon::Information,5000);
        trayIcon->setToolTip("Smart Typer 2000");
        this->setVisible(false);

        event->ignore(); // Don't let the event propagate to the base class
    }

}

所以,当我点击主窗口中的[x]按钮时,应用程序被发送到托盘图标,当我点击这个托盘图标时,主窗口大小和位置恢复,这很好。

但是当我按下 [_] 按钮时,应用程序被最小化,任务栏图标和系统托盘图标都可见,并且单击托盘图标后,应用程序主窗口不会自行恢复。 (即使我用右键单击托盘图标然后选择“打开”选项,窗口也不会自行恢复)

我尝试了各种方法,例如,而不是

this->show();

我试过打电话

this->showNormal();

唯一一次,当窗口恢复时,是我打电话的时候

this->showMaximized();

当然,主窗口确实被最大化了,这不是很好,所以我将最大宽度和最大高度设置为默认的应用程序尺寸(我不介意,因为我的应用程序不需要更大),但... 虽然窗口恢复了,大小还不错,但是位置不行,窗口恢复在我的显示器左上角,有点烂。 所以我尝试使用这段代码 http://doc.qt.io/archives/qt-4.7/restoring-geometry.html

我在隐藏和关闭事件中保存了窗口状态和几何图形,然后在单击托盘图标时尝试恢复它,但没有成功..

那么,你有什么想法吗?窗口最小化时如何通过点击托盘图标恢复窗口?

【问题讨论】:

  • 您的问题与托盘无关,因为最小化窗口不涉及托盘。请显示您用于保存/恢复窗口几何图形的代码。
  • 我的问题与托盘有关,当我之前单击 [_] 按钮时,我想通过单击托盘图标来恢复窗口。当预先按下 [X] 按钮时,我可以通过单击托盘图标来恢复窗口。处理此问题的代码在函数 void MainWindow::trayIconClicked(QSystemTrayIcon::ActivationReason reason); (代码在上面)
  • 好的。不过,您的问题在于您在恢复窗口几何图形时所做的工作。顺便说一句,除非有其他理由这样做,否则您不必只是最小化/最大化。这由操作系统窗口管理器处理。
  • 好吧,但我不需要手动恢复窗口几何图形,在单击 [X] 后恢复窗口时,但正如我所说,我尝试了我在第一篇文章中发布的链接中的代码,并且没用..,Manjabes:不,那不是我要找的,我不想在用户单击 [_] 时将我的应用程序最小化到托盘图标,但我希望能够通过单击托盘图标来恢复应用程序窗口,当用户之前按下 [_] 按钮并将应用程序发送到任务栏

标签: qt window restore trayicon


【解决方案1】:

您应该在主窗口的更改事件中处理应用程序的最小化。一种解决方案是在按下 X 按钮时执行与您相同的操作。

void MainWindow::changeEvent(QEvent *event)
{
    if(event->type() == QEvent::WindowStateChange) {
        if(isMinimized())
            QApplication::sendEvent(this, new QCloseEvent());  
            event->ignore();
    }
}

【讨论】:

  • 这对我不起作用,不仅我无法通过单击托盘图标来恢复窗口,而且当我通过单击任务栏图标来恢复窗口时,窗口是空的。此外,我不想更改最小化事件,我希望用户有两个选项,使用 [_] 按钮将应用程序最小化到任务栏,并使用 [x] 按钮将应用程序最小化到托盘图标。我想要的是,当用户使用 [_] 将应用程序最小化到任务栏时,带有托盘图标的恢复窗口仍然可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多