我正在尝试在 Qt 中实现一个具有 2 个小部件的主窗口:一个区域用于绘制一些点,一个列表框用于将所有点与它们各自的坐标一起写入。我想在主窗口上实现一个按钮的“删除点”功能,即当我按下按钮时,从列表框中选择的点应该从我正在绘制的区域中消失。所以我想用信号/槽来做这件事,但是当我试图从我的绘图区域访问我的点列表时,它只是找不到任何包含数据。到目前为止,这是我的代码:
paintwidget.cpp(我的主窗口):
PaintWidget::PaintWidget(QWidget parent) :
QWidget(parent),
ui(new Ui::PaintWidget)
{
area = new RenderArea(this);
ui->setupUi(this);
connect(ui->displayWidget, SIGNAL(listUpdated(QList)), ui->pointsListWidget,
SLOT(onListUpdated(QList*)));
connect(ui->deletePoints, SIGNAL(clicked()), this, SLOT(deleteItem()));
}
void PaintWidget::deleteItem()
{
area->deletePoint(ui->pointsListWidget->currentItem());
}
renderarea.cpp(我的绘图区):
void RenderArea::mousePressEvent(QMouseEvent *e)
{
point = e->pos();
updateList(point);
this->update();
}
void RenderArea::updateList(const QPoint& p)
{
list.append(p);
if (list.count()>1)
lineAdded(p);
emit listUpdated(&list);
}
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]);
}
void RenderArea::deletePoint(QListWidgetItem *item)
{
bool ok1;
bool ok2;
int index = item->text().indexOf(",");
int x = item->text().left(index).toInt(&ok1, 10);
int y = item->text().mid(index + 1).toInt(&ok2, 10);
for (int i = 0; i < list.size(); ++i)
//find the point with x and y as coordinates and delete it
}
列表框.cpp:
void ListBox::onListUpdated(QList *list)
{
clear();
for (int i = 0; i < list->size(); ++i)
addItem(new QListWidgetItem(QString::number(list->at(i).x()) + ", " +
QString::number(list->at(i).y())));
}
来自渲染区域的列表是 QPoints 的 QList。问题是在 FOR 循环中列表的大小为 0,所以我看不到它应该包含的任何点。我认为我无法在某个地方初始化它,但我不确定在哪里。
这些点是用 QPainter 绘制的,所以当我从列表中删除点时,是否有可能从我的绘图区域中删除它们?