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

How to access a variable from another class in Qt?

本文关键字:另一个 变量 Qt 何访问 访问      更新时间:2023-10-16

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

我怀疑出于某种原因,您有两个RenderArea小部件在附近徘徊。

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

你不应该呼叫ui->displayWidget->deletePoint或连接area的信号吗?

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