Решетка в GraphicsView

Искам да внедря решетка в моя graphicsView, така че да пасва на graphicsView автоматично и когато увелича graphicsView, само размерът на блока на мрежата трябва да се увеличи, но не и ширината на линията на мрежата. Опитах следното, но нищо не се случи.

void CadGraphicsScene::grid(QPainter *painter, const QRectF &rect)
{
    QPen pen;
    painter->setPen(pen);

    qreal left = int(rect.left()) - (int(rect.left()) % gridSize);
    qreal top = int(rect.top()) - (int(rect.top()) % gridSize);
    QVector<QPointF> points;
    for (qreal x = left; x < rect.right(); x += gridSize){
        for (qreal y = top; y < rect.bottom(); y += gridSize){
            points.append(QPointF(x,y));
        }
    }
    painter->drawPoints(points.data(), points.size());
}

Моля, помогнете ми да направя решетка.


person user3859872    schedule 10.11.2014    source източник
comment
Бихте ли обяснили по-подробно какъв е проблема? нищо не се случва е малко широко. Извиква ли се вашият метод, но нищо не е нарисувано?   -  person Bowdzone    schedule 10.11.2014
comment
Да, моят слот се извиква, но нищо не се рисува, когато щракна върху елемент от менюто. Това, което направих, е да щракна върху елемента от менюто, който се нарича този слот. Но при това нищо не се боядисва.   -  person user3859872    schedule 10.11.2014
comment
Откъде идва художникът, който се предава на функцията grid?   -  person TheDarkKnight    schedule 10.11.2014
comment
@Merlin069 Painter е обект към клас QPainter, който се декларира при деклариране на функция.   -  person user3859872    schedule 10.11.2014
comment
Знам какво е QPainter, но къде е обектът, създаден във вашия код? Обикновено QGraphicsScene се използва за добавяне на елементи, които са извлечени от QGraphicsItem или QGraphicsObject. Тези елементи съдържат функция за рисуване, която системата предава QPainter на вашия елемент за изобразяване. Ако просто създадете QPainter самостоятелно и извикате функции за рисуване, няма да видите нищо.   -  person TheDarkKnight    schedule 10.11.2014
comment
Бихте ли могли да начертаете мрежата в графичния изглед, като използвате QGraphicsView::drawBackground метод? Това е, което използвах в моя проект и дебелината на линията на мрежата остава същата при увеличаване и намаляване, докато размерът на мрежата се променя.   -  person thuga    schedule 10.11.2014
comment
Благодаря, този метод ми помогна и успях да имам мрежа. :)   -  person user3859872    schedule 11.11.2014


Отговори (1)


1) Използвайте козметична писалка (с нулева ширина) 2) Чрез QT idiom графичните сцени са независими от изгледа (относно въпроса ви за мащабиране в graphicsview), но можете да извлечете коефициенти на увеличение на изгледа от предадения QPainter обект (QPainter *painter) - QPainter ::worldTransform -> QTransform::m11 (horz_Scale) & QTransform::m22 (vert_Scale) - в този случай можете да преизчислите котвите на мрежата (за 100% увеличение QTransform::m11 == QTransform::m22 == 1.) на 'летя'

person Artiom Khachaturian    schedule 10.11.2014
comment
Съжалявам, но не те разбрах. Можете ли да ми обясните с помощта на пример? - person user3859872; 10.11.2014
comment
const qreal gridSize = 10. * qMax( painter-›worldTransform().m11(), painter-›worldTransform().m22() );//сега 'gridSize' зависи от коефициента на мащабиране на изгледа (10 px, когато zoom = = 100%) - person Artiom Khachaturian; 10.11.2014