0

環境:Ubuntu、Qt Creator

Qtアプリで、Qtがキー押下イベントにすぐに応答しないことがありますが、しばらく待つと、最終的に応答します。

何かがUIをブロックしていると思います。

私が知っているように、Qtのコンポーネント(QWidgetなど)が破壊されている場合、QtUIはブロックされます。コードを確認しましたが、上/下キーを押しているときに破壊されているコンポーネントはありません。QtUIをブロックする可能性のあるものが他にあるかどうかを本当に知りたいです。

{
    ...
    connect(webViewWidget, SIGNAL(loadfinished()), this, SLOT(addItem()));
    ...
}

void addItem()
{
    delete webViewWidget; // will this delete block UI?
    mListWidget = new ScrollWidget();
    mScrollArea = new ScrollArea(this);
    for(int i=0; i<Datalen; i++)
    {
        mListWidget->addSubItem(itemWidget);
    }
}

void keyPressEvent(QKeyEvent *event)
{
    switch(event->key)
    {
    case UP_KEY:
        scroll up;
        break;
    case DOWN_KEY:
        scroll down;
        break;
    default:
        break;
    }
}
4

2 に答える 2

1

一般に、キーを押す前にアプリケーションのイベントキューに入れられた他のすべてのイベントが処理される前に、キーを押すイベントは処理されません。

したがって、処理が完了していないあらゆる種類のイベントである可能性があります。たとえば、QApplication :: hasPendingEventsを使用するか、QApplicationから継承し、イベントが追加または完全に処理されるたびにデバッグ出力を追加することで、イベントがあるかどうかを判断できる場合があります。

于 2012-06-05T12:30:22.167 に答える
0
  • デストラクタで多くの作業を行っている場合を除き、通常、オブジェクトの破壊は問題になりません。Webビューの破棄には時間がかかる場合があります。あなたはおそらくあなたのようにそれを破壊するべきではありません。削除する機器(以下のコードを参照)と所要時間を確認します。

  • 独自のコードが、ブロックするAPIを呼び出している可能性があります。サードパーティのライブラリを呼び出していますか?wait...Qt独自のAPIでメソッドを呼び出していますか?

    よくわからない場合は、すべてのスロットと、のような再実装されたすべての仮想メソッドxxxEvent(...)をインストルメント化できます。コード内のすべてのメソッドではなく、スロットと再実装されたQObject/QWidgetメソッドのみをインストルメント化する必要があります。

  • ループ内に多数のイベントを投稿するか、を介して接続されたスロットに接続された多数の信号を送信することにより、イベントストームを生成している可能性がありますQt::QueuedConnection。たとえばrepaint()、内部から電話をかけていないことを確認してください。paintEvent()

以下の計測例はRAIIを使用しており、非常に簡単に適用できます。または、プロファイラーを使用することもできます。

#include <QElapsedTimer>
#define INSTRUMENT() Instrument instr__ument(__FUNCTION__)
#define INSTRUMENTLIM(lim) Instrument instr__ument(__FUNCTION__, (lim))

class Instrument {
   QElapsedTimer timer;
   int limit;
   const char * function;
public:
   Instrument(const char * name, int timeLimitMs = 20) : 
      function(name), limit(timeLimitMs) { timer.start(); }
   ~Instrument() {
      if (timer.elapsed() > limit) {
         qDebug("%s was slow, took %d ms", function, timer.elapsed());
      }
   }
}

void slot(...)
{
   INSTRUMENT();
   ...

}

void addItem()
{
    INSTRUMENT();
    delete webViewWidget; // will this delete block UI?
    mListWidget = new ScrollWidget();
    mScrollArea = new ScrollArea(this);
    for(int i=0; i<Datalen; i++)
    {
        mListWidget->addSubItem(itemWidget);
    }
}
于 2012-06-05T15:15:47.763 に答える