私が知っている唯一の適切な方法は、イベント フィルターをウィジェットにアタッチし、再描画イベントを除外することです。ウィジェットがどれほど複雑であっても機能します。子ウィジェットを持つことができます。
以下は、完全なスタンドアロンの例です。ただし、いくつかの注意点があり、完成させるにはさらに開発が必要です。ペイント イベントのみがオーバーライドされるため、引き続きウィジェットを操作できますが、効果は表示されません。
マウス クリック、マウスの開始/終了イベント、フォーカス イベントなどは引き続きウィジェットに到達します。再描画時に実行される特定の処理にウィジェットが依存している場合、おそらくそれらのイベントでトリガーされた update() が原因で、問題が発生する可能性があります。
少なくとも、より多くのイベントをブロックするには、case ステートメントが必要です。たとえば、マウスの移動イベントやクリック イベントなどです。フォーカスの処理は懸念事項です。フォーカスされているウィジェットが非表示になっている場合、およびフォーカスを再取得するたびに、チェーン内の次のウィジェットにフォーカスを移動する必要があります。
マウスの追跡にもいくつかの懸念があります。ウィジェットが以前に追跡していた場合、ウィジェットがマウスの追跡を失ったふりをしたいでしょう。これを適切にエミュレートするには、いくつかの調査が必要になります.Qtがウィジェットに提示する正確なマウス追跡イベントプロトコルが何であるかは頭の中でわかりません。
//main.cpp
#include <QEvent>
#include <QPaintEvent>
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QGridLayout>
#include <QDialogButtonBox>
#include <QApplication>
class Hider : public QObject
{
Q_OBJECT
public:
Hider(QObject * parent = 0) : QObject(parent) {}
bool eventFilter(QObject *, QEvent * ev) {
return ev->type() == QEvent::Paint;
}
void hide(QWidget * w) {
w->installEventFilter(this);
w->update();
}
void unhide(QWidget * w) {
w->removeEventFilter(this);
w->update();
}
Q_SLOT void hideWidget()
{
QObject * s = sender();
if (s->isWidgetType()) { hide(qobject_cast<QWidget*>(s)); }
}
};
class Window : public QWidget
{
Q_OBJECT
Hider m_hider;
QDialogButtonBox m_buttons;
QWidget * m_widget;
Q_SLOT void on_hide_clicked() { m_hider.hide(m_widget); }
Q_SLOT void on_show_clicked() { m_hider.unhide(m_widget); }
public:
Window() {
QGridLayout * lt = new QGridLayout(this);
lt->addWidget(new QLabel("label1"), 0, 0);
lt->addWidget(m_widget = new QLabel("hiding label2"), 0, 1);
lt->addWidget(new QLabel("label3"), 0, 2);
lt->addWidget(&m_buttons, 1, 0, 1, 3);
QWidget * b;
b = m_buttons.addButton("&Hide", QDialogButtonBox::ActionRole);
b->setObjectName("hide");
b = m_buttons.addButton("&Show", QDialogButtonBox::ActionRole);
b->setObjectName("show");
b = m_buttons.addButton("Hide &Self", QDialogButtonBox::ActionRole);
connect(b, SIGNAL(clicked()), &m_hider, SLOT(hideWidget()));
QMetaObject::connectSlotsByName(this);
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Window w;
w.show();
return a.exec();
}
#include "main.moc"