나는 방향을 사용하여 선을 그린 위치를 계산하는 눈금자 클래스 (Graduation
)가 있습니다. 이 같은 : 방향이 Qt::Horizontal
로 설정되어효과적으로 Qt에서 물리적으로 정확한 눈금자로 페인팅
내가 line_xpos = precendent_line_xpos + number
을한다. 그런 다음 방향이 Qt::Vertical
인 경우 y 위치에 추가합니다.
나는 몇 가지 코드가있는 아래 내가 if...else
및 ?:
문이 작업을 수행하는 방법의 예입니다 있습니다 여기에
/* std::vector<QLineF> m_lines; */
void Graduation::resizeEvent(QResizeEvent *event)
{
qreal newLength = (m_orientation == Qt::Horizontal)
? event->size().width()
: event->size().height();
qreal oldLength = (m_orientation == Qt::Horizontal)
? event->oldSize().width()
: event->oldSize().height();
if(newLength != oldLength) {
if(newLength < oldLength) { /* Delete lines */
int count = m_lines.size();
if(count == 0)
return;
if(m_orientation == Qt::Horizontal) {
while(m_lines[count-1].x1() > newLength) {
--count;
}
} else {
while(m_lines[count-1].y1() > newLength) {
--count;
}
}
m_lines.erase(
m_lines.begin()+count,
m_lines.begin()+m_lines.size()
);
} else
/* ... Append lines ... */
}
}
선이 그려집니다 방법을 보여 할 수있는 paintEvent은 다음과 같습니다
void Graduation::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event)
QPainter painter(this);
painter.setPen(QPen(Qt::black, 0.5));
for(unsigned int i = 0; i < m_lines.size(); ++i)
painter.drawLine(m_lines[i]);
}
수천 번 확인 된 조건을 지킬 수 있는지 알고 싶습니다. 어떤 코드 패턴을 사용하여 을 피할 수 있는지 관심이 있습니다 (라인 위치를 한 번만 계산하고 표시되는 것만 표시하는 것이 더 좋을 수도 있음).
기능 포인터, 펑, 람다 – deviantfan
@deviantfan. pointed 객체가 각 반복을 변경할 때 어떻게 m_lines [count-1] .x1()에서 함수 포인터를 사용할 수 있습니까? – Eliot545
@ Eliot545 질문을 편집 해 주셔서 감사합니다. 이미지를 임베드했습니다 (더 많은 평판 포인트를 얻은 후에 직접 할 수 있습니다 ...). ['Length'] (http://en.wiktionary.org/wiki/length) 패턴이 규칙적이라면 라인 위치에 대한 각 쌍의 엔드 포인트를 저장하는 것이 필요하지 않습니다. 예 : 백만 픽셀 너비의 위젯은 모든 선을 벡터로 그릴 필요는 없습니다. * (사용자가 어떻게 든 움직일 수 없거나 이동할 장소가없는 한) * – HostileFork