События перемещения мыши QT находятся в отдельном потоке?И как исправить проблему рисования приложения, связанную с этим - PullRequest
1 голос
/ 19 декабря 2010

Я делаю программу рисования для рисования трехмерных сеток с помощью круглой кисти.Из-за того, как я указываю область, которую нужно изменить на цвет кисти, я считаю, что события MouseMove запускаются быстрее, чем программа может закончить рисование, таким образом, вместо простого изменения круга на другой цвет, он переполняется и заканчиваетсяраскраска всей сетки.

В mouseMove вызывается следующее:

void Mesh::setCircle(Face *face, int radius, Color color) {
    for (unsigned int i = 0; i < mouseOvers.size(); i++)
        faceList[mouseOvers[i]].mouseOver = false;
    mouseOvers.clear();

    ...
    // finds the faces on the mesh around the centerIndex on the circle (just the outline of the circle)
    // calls face->mouseOver = true; for each of those faces
    // adds the indices of the faces to mouseOvers
}

Выше приведено описание контура кисти на сетке, чтобы пользователи знали, что онисобирается рисовать.Когда пользователь нажимает кнопку мыши, вызывается следующее:

void Mesh::getAdjacent(Face *face, vector<Face *> &adjacent) {
    for (unsigned int i = 0; i < mouseOvers.size(); i++)
        adjacent.push_back(&faceList[mouseOvers[i]]);

    int currentUp = face->listIndex;
    int currentDown = currentUp;
    helperGetAdjacent(currentUp, adjacent);

    while (!faceList[currentUp].mouseOver) {
        //up
        if (currentUp >= numCols) {
            currentUp -= numCols;
            helperGetAdjacent(currentUp, adjacent);
        }
        else
            break;
    }
    while (!faceList[currentDown].mouseOver) {
        //down
        if (currentDown < numCols * (numRows-1)) {
            currentDown += numCols;
            helperGetAdjacent(currentDown, adjacent);
        }
        else
            break;
    }
}

void Mesh::helperGetAdjacent(int trunk, vector<Face *> &adjacent) {
    int currentRight = trunk;
    int currentLeft = trunk;

    adjacent.push_back(&faceList[trunk]);

    while (!faceList[currentRight].mouseOver) {
        // check right
        if (currentRight % numCols != numCols - 1) {
            adjacent.push_back(&faceList[currentRight + 1]);
            currentRight++;
        }
        else
            break;
    }
    while (!faceList[currentLeft].mouseOver) {
        //check left
        if (currentLeft % numCols != 0) {
            adjacent.push_back(&faceList[currentLeft - 1]);
            currentLeft--;
        }    
        else
            break;
    }
}

Краткая сводка кода выше, я использую свойство mouseOver на гранях, чтобы определить, когда прекратить добавлять грани к * 1009.* (который возвращается и окрашивается в другой функции).

Теперь это работает, когда пользователь просто щелкает мышью.Когда пользователь перетаскивает его, удерживая, я просто вызываю эту функцию getAdjacent снова.Если пользователь перемещает мышь достаточно медленно, ожидаемое поведение (грани окрашиваются мышью, как кисть), но если пользователь перетаскивает быстрее (а это не очень быстро), вся сетка будет окрашена.

Я подозреваю, что событие mousemove вызывается в другом потоке, в результате чего функция setCircle вызывается до завершения функции getAdjacent.Элемент mouseOver в Face изменяется на false и getAdjacent не останавливается в нужном месте.

Как я могу исправить эту проблему?

Большое спасибо!

1 Ответ

2 голосов
/ 19 декабря 2010

Ваше подозрение неверно ... Qt использует только один поток (основной поток) для своего графического интерфейса.Так что ваша проблема где-то еще.Это может быть ошибка в вашем коде (я не буду пытаться отлаживать логику здесь, поскольку я не думаю, что смогу справиться с этим достойно), или это может быть то, что Qt комбинирует события MouseMove, когда это возможно (дляизбегайте постоянно увеличивающейся очереди событий, если обратные вызовы возвращаются медленно), что может быть не тем, что ожидает ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...