0

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 で描画されるため、リストからポイントを削除すると、描画領域からも削除される可能性はありますか?

4

1 に答える 1

1

I'm suspecting you've got two RenderArea widgets hanging around for some reason.

You're connecting ui->displayWidget's signal, but acting on the area widget for the delete.

Shouldn't you be calling ui->displayWidget->deletePoint or connecting area's signal?

As for the repaint, you should call the widget's update() method to have it repaint itself.

于 2011-06-04T11:49:29.383 に答える