3

QMainWindow のウィジェット クラス サブクラスがあり、中央のウィジェット (QWidget) があり、オーバーライドされた paintEvent 関数で、この中央のウィジェットで QPainter のインスタンスを作成できますか? 次のようなコード:

void MyMainWindow::paintEvent(QEvent *event)
{
    QPainter painter(_theCentralWidget);
    //drawing...
    return QMainWindow::paintEvent(event);
}

QWidget の新しい C++ クラス サブクラスを作成し、その paintEvent 関数をオーバーライドしてから、元の中央ウィジェットをこの新しいものに置き換えたくありません... (上記のようにしましたが、ペインタがアクティブではないというエラーが発生しました.. .)

4

3 に答える 3

4

良い。中央のウィジェットをサブクラス化したくない場合は、それにイベント フィルタをインストールして、ペイント イベントを処理できます。

http://qt-project.org/doc/qt-4.8/qobject.html#installEventFilter

于 2012-06-21T20:52:28.907 に答える
3

C++11 ラムダを使用して、この問題を解決できます。指定したラムダを介してフィルタリングを通過する、新しい一般的な「何かのイベント」 QObject を作成します。次に、この汎用オブジェクトを目的のロジックを使用してディスプレイ ウィジェットに追加します。例えば:

generic-qevent-filter.hpp:

#pragma once

class GenericQEventFilter : public QObject
{
  Q_OBJECT

public:
  GenericQEventFilter(QObject *parent, std::function<bool (QObject *obj, QEvent *event)> event_filter_f);
  std::function<bool (QObject *obj, QEvent *event)> event_filter_f;

protected:
  bool eventFilter(QObject *obj, QEvent *event);

};

ジェネリック-qevent-filter.cpp:

#include "generic-qevent-filter.hpp"

GenericQEventFilter::GenericQEventFilter(QObject *parent, 
                     std::function<bool (QObject *obj, QEvent *event)> event_filter_f)
  : QObject(parent), event_filter_f(event_filter_f)
{
}


bool GenericQEventFilter::eventFilter(QObject *obj, QEvent *event)
{
  return this->event_filter_f(obj, event); 
}

そして、これをコードで次のように使用します。

MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
{ 
   ui = new Ui_MainWindow();
   ui->setupUi(this); // Initialise widgets
   this->wire_up_gui(); // Connect signals and slots

   ui->displayWidget->installEventFilter(new GenericQEventFilter(this, [&] (QObject *obj, QEvent *event) {
     if(event->type() == QEvent::Paint) {
       paint_display_widget(obj, event);
       return true;
     }
     return false;
   }));
}
于 2012-12-05T05:41:16.733 に答える
0

「警告: paintdevice がウィジェットの場合、QPainter は paintEvent() 関数内または paintEvent() によって呼び出される関数内でのみ使用できます。これは、Qt::WA_PaintOutsidePaintEvent ウィジェット属性が設定されていない限りです。Mac OS X および Windows の場合、この属性の設定に関係なく、paintEvent() 関数でのみペイントできます。"

出典:QTドキュメント

于 2012-06-21T14:46:40.627 に答える