如何通知小部件有关Qt中另一个小部件的更改?
我试图在Qt中实现一个有两个子窗口小部件的窗口小部件:一个是渲染区域,我在这里绘制一些点并连接它们之间的线,另一个是我想要插入的ListBox我用绘制区域的坐标绘制的所有点的列表。使用Qt Designer添加的2个小部件。这里是我的代码至今:如何通知小部件有关Qt中另一个小部件的更改?
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;
}
我的问题是如何从渲染区域小部件列表框我发送我画了另一点,它应该在列表中的坐标一起显示?
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*)));
注:nameing是在这种情况下的可读性和维护void RenderArea::updateList(QPoint p)
非常重要的它更void RenderArea::addPoint(const QPoint& p)
(也注意到const reference
告诉编译器我们不会改变p
事件,如果我们有它的参考)
嗨,我试过你的代码,但它仍然无法正常工作。它只是说 对象::连接:没有这样的插槽QListWidget :: onPointAdded(QPoint *)在.. \ paintWidget \ paintwidget.cpp:13 对象::连接:(发件人名称: 'displayWidget') 对象:: connect :(接收器名称:'listWidget') 它只是没有找到插槽。 – schmimona 2011-05-30 13:27:08
'QListWidget :: onPointAdded(QPoint *)'不直接存在于Qt中。你必须在QListWidget之上实现你自己的类**,就像'class ListBox:public QListWidget'一样,在Qt中看到一些例子。然后在**你的**'ListBox'中定义并实现你的插槽,然后连接它。 – vrince 2011-05-30 13:56:37
谢谢,它现在有效。 – schmimona 2011-05-31 09:44:02
QT开发中使用的一般方法是使用signal/slots进行软件组件之间的通信。所以基本上你需要在你的源组件中定义一个信号(例如RenderArea或者你喜欢的),并且将你在另一个组件中定义的插槽(即你的窗口窗口)连接起来,然后通过一个动作发出一个信号。
在引用的链接中也有示例。
为什么使用'新'和'删除'而不是只包含一个值? – Puppy 2011-05-30 12:55:46