如何从Qt中的另一个类访问变量?

时间:2011-06-04 10:45:51

标签: c++ qt4 qpainter

我试图在Qt中实现一个主窗口,它有两个小部件:一个区域,我绘制一些点和一个列表框,我用各自的坐标写出所有点。并且我想在主窗口上实现按钮的功能“删除点”,即当我按下按钮时,从列表框中选择的点应该从我正在绘制的区域消失。所以我想用信号/插槽做这个,但当我尝试从我的绘图区域访问我的点列表时,它只是找不到任何包含数据。这是我的代码,直到现在:

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
}

listbox.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绘制点,所以当我从列表中删除点时,是否有可能从绘图区域删除它们?

1 个答案:

答案 0 :(得分:1)

我怀疑你出于某种原因有两个RenderArea小部件。

您正在连接ui->displayWidget的信号,但会在area小部件上执行删除操作。

你不应该打电话给ui->displayWidget->deletePoint或连接area的信号吗?

至于重绘,你应该调用小部件的update()方法让它自己重绘。