0

当用户有很多条目时,我计算了一些条目并想发出一条消息,因为它会令人困惑。

然而另一方面,用户应该可以选择禁用此警告。

这就是为什么我想使用QErrorMessage.

但是QErrorMessage即使不应该出现(/未选中复选框时),我也会继续出现。

这是我写的最短的代码:

void checkNumber(int const &n)
{
    if(n > CriticalNumber)
    {
        QErrorMessage msg(this);
        msg.showMessage("too much!");
    }
}

我忘了什么吗?

有趣的是,在您取消选中该复选框后,在每次下一次调用中都未选中它......

// 编辑:

即使QErrorMessage是我的班级成员并且没有在每次调用中初始化,也会发生此错误。

//编辑2:

现在我很确定,这个错误只发生在我使用QString::arg. 我没有在示例代码中使用它,因为我认为这没有什么区别。所以这个例子应该是这样的:

void showError(int const &n, QErrorMessage *msg)
{
    msg->showMessage(tr("%1 is too big").arg(n));
}

showError()在前面的 if 语句中调用。

4

2 回答 2

1

我解决了这个问题(在edit2中指定)。

问题是,QErrorMessage保存所有QStrings不应该再次显示的内容。

因为我arg()几乎每次都会创建一个新QStringQErrorMessage,每次更改时都会显示。

例子:

QErrorMessage msg(this);
showError(1, msg);
showError(2, msg);
showError(1, msg);

第一个showError(1, msg)将显示 QErrorMessage。如果取消选中该复选框,showError(2, msg)将显示(因为显示不同QString),但不会showError(1, msg)显示(因为显示QString与第一个相同。

于 2014-06-16T10:36:46.183 回答
0

我无法重现您的问题。您应该做的是成为checkNumber一个类的成员,并为您的msg对象做同样的事情。

这是一个工作示例:

主windows.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QErrorMessage>
#include <QTimer>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void showErrorMsg();

private:
    Ui::MainWindow *ui;
    QErrorMessage msg;
    QTimer timer;
};

#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(&timer, SIGNAL(timeout()), this, SLOT(showErrorMsg()));
    timer.start(3000); // we use a timer to show an error message
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::showErrorMsg()
{
    msg.showMessage("My message");
}
于 2014-06-05T13:23:51.047 回答