如何在Qt中通知小部件有关另一个小部件中的更改的信息?

问题描述

| 我正在尝试在Qt中实现一个具有其自身的2个子窗口小部件的窗口小部件:一个是渲染区域,我在其中绘制一些点并在它们之间连接线,另一个是ListBox,我要在其中插入所有列表我从渲染区域绘制的点及其坐标。 Qt Designer中添加了2个小部件。到目前为止,这是我的代码: renderarea.h:
class RenderArea : public QWidget
{
    Q_OBJECT

public:
    RenderArea(QWidget *parent = 0);
    QPoint point;
    QList<QPoint> 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 < list.size(); ++i)
        painter.drawPoint(list[i]);
    if (list.size()>1)
        for(int j = 0; j < 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,它应该与它的坐标一起显示在列表中?     

解决方法

        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*)));
注意:命名对于提高可读性和维护ѭ9非常重要,在这种情况下,它要比ѭ10更重要(还请注意ѭ11告诉编译器我们没有更改
p
事件,如果有引用的话)     ,        QT开发中使用的通用方法是使用信号/插槽在软件组件之间进行通信。因此,基本上,您需要在源组件(例如RenderArea或任何您喜欢的地方)中定义一个信号,并将您在另一个组件中定义的插槽连接到某个地方(即您的“窗体窗口”),并在操作时触发信号。 在引用的链接中也有示例。