6

私はこれに何時間も取り組んでいますが、それを理解することも、オンラインで役立つヘルプを見つけることもできません. 基本的に私が達成しようとしていることの要点は、ボタンとQTextBrowser. ボタンを押すと、メッセージが表示され、このメッセージが 10 秒ごとに出力され続けます。

10 秒ごとにメッセージを表示するタイマーを用意するのは理にかなっているので、QTimer を使用すると考えました。これを `buttonClicked() SLOT に最初に実装したとき、プログラムがフリーズしました。オンラインで解決策を探したところ、QApplication::processEvents() が見つかりました。

したがって、基本的に私の機能では、次のようなものがありました。

while(1)
{
   QTimer *timer;
   connect(...)  //omitted parameters for this example     
   timer.start(10000);
   ui->diplay->append("Message");

   while(timer.isActive())
   {
      QApplication::processEvents() 
   }
}

timer.isActive() while ループから抜け出すだろうと考えましたが、単にそこにとどまるわけではありません。

したがって、これはスレッドの問題であると考えました。だから私は QThreads を使用する方法を考え出しましたが、まだ動作させることができません。基本的に、タイマーを使用してスレッドを作成し、スレッドがタイマーに開始を指示すると、プログラムが終了し、コンソールに「プログラムが予期せず終了しました」と表示されます。

これを行うには簡単な方法が必要ですが、Qt での私の実績は常に次のとおりです。

4

5 に答える 5

7

メッセージを 10 秒間表示したい場合は、メッセージを消去するスロットをアプリケーションに作成することをお勧めします。次に、ボタンをクリックしたスロットにメッセージを追加し、10 秒で削除メッセージ スロットをトリガーするタイマーを初期化します。

QTimer::singleShot(10000, this, SLOT(eraseMessageSlot()));

また、そこにスレッドは必要ありません...

于 2011-01-14T19:35:10.533 に答える
4

あなたのコードには多くの問題があります-本質的には疑似コードであると思いますtimerが、存在しないなどです。

リファレンスをチェックしてQTimerください。例があります:

 QTimer *timer = new QTimer(this);
 connect(timer, SIGNAL(timeout()), this, SLOT(update()));
 timer->start(1000);

基本的に、追加するスロットを作成し、それをtimeout信号に接続してタイマーを開始します。タイマーが進み、1 秒ごとにスロットが呼び出されます。あなたの場合、あなたはに変更1000します10000

これがうまくいかない場合、あなたが抱えている問題は正確には何ですか?とにかく必要でない限り、スレッドを使用している理由がわかりません。

編集更新を見て、10 秒間待ちたいと言っています。ビジー待機の代わりに、自分のスロット ( によって呼び出されるsingleShot) でプログラムを続行してみませんか? Qtの哲学の一部が欠けていると思います...

于 2011-01-14T19:35:18.067 に答える
4

次のようにプログラムを編成することをお勧めします。

class MainWindow : QWidget //or any other parent class
{
public:
MainWindow()
{
    QPushButton *button = new QPushButton(this);
    browser_ = new QTextBrowser(this); //and some params maybe
    QVBoxLayout * layout = new QVBoxLayout(this); //can be used another layout
    layout->addWidget(button);
    layout->addWidget(browser_);

    connect(button, SIGNAL(pressed()),
        this, SLOT(onButtonPressed()));

    timer_ = new QTimer(this);
    connect(timer, SIGNAL(timeout()), 
        this, SLOT(timerHandler()));
    }
    ~MainWindow();

public slots:
    void onButtonPressed()
    {
        timerHandler(); //to display message when button is pressed
        if (!timer->isActive()) timer->start(TIMER_INTERVAL); //TIMER_INTERVAL = 10000;
    }
    void timerHandler()
    {
         //put your code to display message here
    }

private:
    QTextBrowser *browser_;
    QTimer *timer_;
}
于 2011-01-15T00:47:42.683 に答える
1

OPが10秒ごとにメッセージを繰り返し表示したいと思ったのですか?

その場合、単純にタイマーを作成し、updateDisplay() 関数スロットをタイマー シグナルに接続して、タイマーを開始します。

于 2011-01-14T20:03:22.453 に答える
1

デフォルトでは、QTimer は停止するまで間隔ごとに起動します。timer.isActive()それが常に真である理由です。timer.setSingleShot(true)タイマーを 1 回だけ起動するために使用します。(またはQTimer::singleShot、@tibur の投稿のように使用します。)

于 2011-01-14T19:48:02.237 に答える