0

2 つのウィジェットを含む小さなテスト アプリケーションを作成しました。内側のウィジェットのマウスの移動、プレス、リリース イベントを再実装して、ドラッグ アンド ドロップで大きな親の内側にウィジェットを移動できるようにしました。

しかし、動かすと上と左から黒い跡が現れます。これはどのように見えるかです:

ここに画像の説明を入力

これが私のコードです:

main.cpp :

#include <QApplication>

#include "widget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Widget w;
    w.show();

    return a.exec();
}

widget.h :

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPaintEvent>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

protected:
    void paintEvent(QPaintEvent *e);
};

#endif // WIDGET_H

ウィジェット.cpp :

#include "widget.h"
#include "innerwidget.h"

#include <QPainter>

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    new InnerWidget(this);

    resize(400, 200);
}

Widget::~Widget()
{
}

void Widget::paintEvent(QPaintEvent* e)
{
    QPainter p(this);
    p.setBrush(Qt::lightGray);
    p.drawRect(e->rect());
}

innerwidget.h :

#ifndef INNERWIDGET_H
#define INNERWIDGET_H

#include <QWidget>
#include <QPaintEvent>

class InnerWidget : public QWidget
{
    Q_OBJECT
public:
    explicit InnerWidget(QWidget *parent = 0);
    ~InnerWidget();

protected:
    void mousePressEvent(QMouseEvent *e);
    void mouseReleaseEvent(QMouseEvent *e);
    void mouseMoveEvent(QMouseEvent *e);
    void paintEvent(QPaintEvent *e);

private:
    bool m_leftButtonPressed;
    QPoint m_mousePosOnBar;
};

#endif // INNERWIDGET_H

innerwidget.cpp :

#include "innerwidget.h"

#include <QPainter>
#include <QPaintEvent>
#include <QStyleOption>

InnerWidget::InnerWidget(QWidget *parent) : QWidget(parent)
{
    setGeometry(10, 10, 100, 100);
    setStyleSheet("background-color: red");
}

InnerWidget::~InnerWidget()
{

}

void InnerWidget::mousePressEvent(QMouseEvent* e)
{
    if(e->button() == Qt::LeftButton)
    {
        m_mousePosOnBar = e->pos();
        m_leftButtonPressed = true;
    }

    e->accept();
}

void InnerWidget::mouseReleaseEvent(QMouseEvent* e)
{
    if(e->button() == Qt::LeftButton)
    {
        m_leftButtonPressed = false;
    }

    e->accept();
}

void InnerWidget::mouseMoveEvent(QMouseEvent* e)
{
    if(m_leftButtonPressed)
    {
        move(e->pos().x() - m_mousePosOnBar.x() + geometry().x(),
             e->pos().y() - m_mousePosOnBar.y() + geometry().y());
    }


    e->accept();
}

void InnerWidget::paintEvent(QPaintEvent* e)
{
    Q_UNUSED(e)

    QPainter p(this);

    QStyleOption opt;
    opt.init(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}

編集: 呼び出すとトレースが消えますWidget::repaintが、イベントフィルターをインストールして、InnerWidget移動するたびに再描画する必要があります。イベントフィルターを使用せずに、よりクリーンなソリューションが必要です...

実際に何が起こっているのか誰か教えてもらえますか?

4

1 に答える 1

0

電話QWidget::update()Widget::paintEventかけると問題が解決しました:

void Widget::paintEvent(QPaintEvent* e)
{
    QPainter p(this);
    p.setBrush(Qt::lightGray);
    p.drawRect(e->rect());

    update();
}
于 2015-04-15T13:38:04.163 に答える