8

我正在构建一个 Qt Symbian 项目,我想向用户显示一条通知,该通知应在几秒钟后自动关闭。我已经看到诺基亚在他们的用户界面中使用了很多。

现在我正在使用下面的代码,以便用户可以关闭 QMessageBox,但我希望它可以在 1 或 2 秒后自动关闭 QMessageBox。我怎样才能使用 Qt 做到这一点?

QMessageBox msgBox;
msgBox.setText("Hello!");
msgBox.setIcon(QMessageBox::Information);
msgBox.setStandardButtons(QMessageBox::Ok);
msgBox.exec();
4

6 回答 6

7

非常感谢!我的解决方案:

我创建了自己的类(MessageBox),这是我展示它的代码:

MessageBox msgBox;
msgBox.setText("Hello!");
msgBox.setIcon(QMessageBox::Information);
msgBox.setStandardButtons(QMessageBox::Ok);
msgBox.setAutoClose(true);
msgBox.setTimeout(3); //Closes after three seconds
msgBox.exec();

这是我的课:

class MessageBox : public QMessageBox

int timeout;
bool autoClose;
int currentTime;

void MessageBox::showEvent ( QShowEvent * event ) {
    currentTime = 0;
    if (autoClose) {
    this->startTimer(1000);
    }
}

void MessageBox::timerEvent(QTimerEvent *event)
{
    currentTime++;
    if (currentTime>=timeout) {
    this->done(0);
    }
}
于 2010-02-10T22:21:10.203 回答
4

我建议子类QMessageBox添加你自己想要的行为......

setAutoClose(bool)添加类似and的方法并在启用 AutoClose 选项时setAutoCloseTimeout(int)触发QTimeron会很有趣!showEvent

这样,您甚至可以更改您的外观QMessageBox并显示“此框将在 XXX 秒后自动关闭...”或进度条等文字...

于 2010-02-10T14:08:29.053 回答
2

相反,您可以使用SingleshotTimer 关闭任何对话框,或者QLabel更轻松:

QTimer *timer;
QTimer::singleShot(10000, msgBox, SLOT(close()));
于 2016-12-02T11:03:47.113 回答
2

这可能会帮助某人,

msgBox.button(QMessageBox::Ok)->animateClick(5000);

消息框在 5 秒后关闭。

于 2019-03-08T12:31:36.397 回答
1

使用此代码:

QTimer *timer;
QTimer::singleShot(10000, msgBox, SLOT(close()));

你得到:

QObject::connect: Incompatible sender/receiver arguments
        QTimer::timeout() --> QMessageBox::

因为 msgBOX (接收者)必须是 QtCore 对象.. 并且 QMessageBox 是 QtGui 的子类。见https://srinikom.github.io/pyside-docs/PySide/QtCore/QTimer.html#PySide.QtCore.PySide.QtCore.QTimer.singleShot

于 2017-11-04T13:02:43.053 回答
0

对于 Python,类似的东西QTimer.singleShot(5000, lambda : qm.done(0))可能会起作用。

下面的示例将在 5 秒后超时关闭,如果超时则触发“否”选项。

import sys

from PySide2.QtCore import *
from PySide2.QtWidgets import *

app = QApplication(sys.argv)

qm = QMessageBox()
qm.setText("Continue?")
qm.setStandardButtons(QMessageBox.Yes)
qm.addButton(QMessageBox.No)
qm.setDefaultButton(QMessageBox.No)
QTimer.singleShot(5000, lambda : qm.done(0))
if qm.exec_() == QMessageBox.Yes:
    print("Yes!")
else:
    print("No!")
于 2022-01-27T21:08:43.347 回答