0

ユーザーが多くのエントリを持っている場合、紛らわしいので、いくつかのエントリを数えてメッセージを出力したいと思います。

それにもかかわらず、ユーザーにはこの警告を無効にするオプションが必要です。

それが私が使いたかった理由QErrorMessageです。

しかし、QErrorMessage表示されるべきではない場合でも表示され続けました(/チェックボックスがオフになっている場合)。

これは私が書いた最短のコードです:

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

私は何かを忘れましたか?

面白いことに、チェックボックスを一度オフにすると、次の呼び出しごとにオフになります...

// 編集:

QErrorMessageこのエラーは、がクラスのメンバーであり、すべての呼び出しで初期化されていない場合でも発生します。

// edit2:

今では、このエラーは を使用したときにのみ発生すると確信しています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

これが実際の例です:

mainwindow.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 に答える