Как получить доступ к переменной из другого класса в Qt? - PullRequest
0 голосов
/ 04 июня 2011

Я пытаюсь реализовать в Qt главное окно, в котором есть 2 виджета: одна область, где я рисую несколько точек, и одна область списка, где я пишу все точки с их соответствующими координатами. И я хотел бы реализовать функцию «удалить точку» кнопки в главном окне, то есть когда я нажимаю кнопку, точка, выбранная из списка, должна исчезнуть из моей области, где я рисую. Так что я думал о том, чтобы сделать это с помощью сигналов / слотов, но когда я пытаюсь получить доступ к своему списку точек из области рисования, он просто не находит никаких содержащих данных. Это мой код до сих пор:

paintwidget.cpp (мое главное окно):

<code>
PaintWidget::PaintWidget(QWidget <em>parent) :
        QWidget(parent),
        ui(new Ui::PaintWidget)
{
    area = new RenderArea(this);
    ui->setupUi(this);
    connect(ui->displayWidget, SIGNAL(listUpdated(QList</em>)), ui->pointsListWidget,
            SLOT(onListUpdated(QList*)));
    connect(ui->deletePoints, SIGNAL(clicked()), this, SLOT(deleteItem()));
}
void PaintWidget::deleteItem()
{
    area->deletePoint(ui->pointsListWidget->currentItem());
}

renderarea.cpp (моя область рисования):

<code>
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:

<code>
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. Проблема в том, что в цикле FOR размер списка равен 0, поэтому я не вижу ни одной из точек, которые он должен содержать. Я думаю, что мне не удалось инициализировать его где-то, но я не уверен, где.

Точки рисуются с помощью QPainter, поэтому, когда я удаляю точку из списка, есть ли возможность удалить их и из моей области рисования?

1 Ответ

1 голос
/ 04 июня 2011

Я подозреваю, что по какой-то причине у вас есть два RenderArea виджета.

Вы подключаете сигнал ui->displayWidget, но воздействуете на виджет area для удаления.

Разве вы не должны звонить ui->displayWidget->deletePoint или подключать сигнал area?

Что касается перекраски, вы должны вызвать метод update() виджета, чтобы он перекрасился сам.

...