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

时间:2011-05-30 11:26:41

标签: c++ qt4

我正在尝试在Qt中实现一个小部件,它有两个自己的子小部件:一个是渲染区域,我绘制一些点并在它们之间连接线,另一个是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,我绘制了另一个点,它应该与列表中的坐标一起显示?

2 个答案:

答案 0 :(得分:4)

QT开发中使用的一般方法是使用signal/slots进行软件组件之间的通信。所以基本上你需要在你的源组件中定义一个信号(例如RenderArea或者你喜欢的那个)并在某个地方(即你的表单窗口)连接你在另一个组件中定义的插槽,并在动作时发出信号。

参考链接中也有一些例子。

答案 1 :(得分:1)

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 } event如果我们有它的参考)