Как уведомить виджет об изменениях в другом виджете в Qt? - PullRequest
1 голос
/ 30 мая 2011

Я пытаюсь реализовать виджет в Qt, который имеет 2 собственных дочерних виджета: один - область визуализации , где я рисую некоторые точки и соединяю линии между ними, а другой - ListBox, где Я хотел бы вставить список всех точек, которые я нарисовал, с их координатами из области рендеринга. 2 виджета были добавлены с помощью Qt Designer. Вот мой код до сих пор:

renderarea.h:


class RenderArea : public QWidget
{
    Q_OBJECT

public:
    RenderArea(QWidget *parent = 0);
    QPoint point;
    QList&ltQPoint> list;

protected:
    void mousePressEvent(QMouseEvent *);
    void paintEvent(QPaintEvent *event);
    void updateList(QPoint p);
};

renderarea.cpp:


RenderArea::RenderArea(QWidget *parent)
    : QWidget(parent)
{
    setBackgroundRole(QPalette::Base);
    setAutoFillBackground(true);
}

void RenderArea::mousePressEvent(QMouseEvent *e)
{
    point = e->pos();
    updateList(point);
    this->update();
}

void RenderArea::updateList(QPoint p)
{
    list.append(p);
}
void RenderArea::paintEvent(QPaintEvent * /* event */)
{
    QPainter painter(this);
    painter.setPen(QPen(Qt::black,2));
    for (int i = 0; i &lt list.size(); ++i)
        painter.drawPoint(list[i]);
    if (list.size()>1)
        for(int j = 0; j &lt list.size()-1; ++j)
                painter.drawLine(list[j], list[j+1]);
}

paintwidget.h:


class PaintWidget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::PaintWidget *ui;
};

paintwidget.cpp:


PaintWidget::PaintWidget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::PaintWidget)
{
    ui->setupUi(this);
}

PaintWidget::~PaintWidget()
{
    delete ui;
}

У меня вопрос, как передать из виджета области рендеринга в мой ListBox, что я нарисовал другую точку, и она должна отображаться вместе с ее координатами в списке?

Ответы [ 2 ]

4 голосов
/ 30 мая 2011

Общий подход, используемый в разработке QT, использует сигнал / слоты для связи между компонентами программного обеспечения. Поэтому в основном вам нужно определить сигнал в исходном компоненте (например, RenderArea или где угодно) и подключить ваш слот, определенный где-то в другом компоненте (то есть в окне формы), и запустить сигнал при действии.

В ссылочной ссылке также есть примеры.

1 голос
/ 30 мая 2011

OrcunC дал вам хороший совет.Если вы не знакомы с реализацией сигналов / слотов, вот некоторые советы, с которых вы можете начать.

renderarea.h

signal:
    void pointAdded(QPoint*);

renderarea.cpp

void RenderArea::updateList(QPoint p)
{
    list.append(p);
    emit pointAdded(&list.back());
}

listbox.h

public slots:
    void onPointAdded(QPoint*);

listbox.cpp

void ListBox::onPointAdded(QPoint* point)
{
    //lets assume your ListBox is a QListWidget
    addItem( QString::number(point->x()) + "," + QString::number(point->y()))
}

где-то экземплярListBox и RenderArea доступны

QObject::connect( renderArea, SIGNAL(pointAdded(QPoint*),
                  listBox,    SLOT(onPointAdded(QPoint*)));

ПРИМЕЧАНИЕ: имя очень важно для удобства чтения и обслуживания. void RenderArea::updateList(QPoint p) в этом случае больше void RenderArea::addPoint( const QPoint& p) (также обратите внимание на const reference, сообщающее компиляторучто мы не меняем p событие, если оно у нас есть)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...