2013-03-08 15 views
5

pracuję nad aplikacji gdzie potrzebne do wypełnienia kolor pixmapy wykorzystaniem Painter. Pixmap jest typu prostokąta z (dolną krawędzią) 2 zaokrąglonymi narożnikami. Najlepsze 2 rogi są płaskie/normalne.Rysowanie prostokąta o zaledwie 2 rogi zaokrąglone w Qt

Próbowałem użyć drawRoundedRect() API Qt, ale to sprawia, że ​​wszystkie narożniki prostokąta zaokrąglony. Muszę narysować prostokąt z zaokrąglonymi 2 rogami i dwoma innymi płaskimi.

Jeśli ktoś natknie sytuacji, proszę mi zaproponować rozwiązanie.

Dzięki

+0

Czy uważasz, że któraś z odpowiedzi jest prawidłowa? – darkgaze

Odpowiedz

14

Można używać QPainterPath za to:

QPainterPath path; 
    path.setFillRule(Qt::WindingFill); 
    path.addRoundedRect(QRect(50,50, 200, 100), 20, 20); 
    path.addRect(QRect(200, 50, 50, 50)); // Top right corner not rounded 
    path.addRect(QRect(50, 100, 50, 50)); // Bottom left corner not rounded 
    painter.drawPath(path.simplified()); // Only Top left & bottom right corner rounded 
+0

Dziękuję bardzo za odpowiedź. To działa dobrze. – user2111197

+0

to też mi pomogło, dzięki! – netawater

+1

@ user2111197 Powinieneś oznaczyć go jako zaakceptowaną odpowiedź, jeśli rozwiązał Twój problem –

3

można używać arkuszy stylów (na starcie lub załadunku QSS pliku). Można zarządzać zrobić to bardzo łatwo:

QString str = "bottom-right-radius: 10px; top-right-radius: 0px...."; 
box->setStylesheet(str); 

Przypuszczam, że skrzynka jest pixmap wewnątrz QLabel (label-> setPixmap (...))

LUB

Ustaw nazwę obiektu do czegoś (etykiecie), a następnie użyć

QLabel # nazwa {bottom-right-radius: 10px ...}

W arkuszu stylów możesz załadować.

Sprawdź to miejsce na zewnątrz. Pomaga: http://border-radius.com/

0

Aby przedłużyć odpowiedź Romha Korev. Oto przykład pudełka z zaokrąglonymi górnymi rogami (górny lewy, prawy górny róg). Prostokąty w rogach są obliczane na podstawie głównego prostokąta!

qreal left = 5; 
qreal top = 10; 
qreal width = 100; 
qreal height = 20; 
QRectF rect(left, top, width, height); 

QPainterPath path; 
path.setFillRule(Qt::WindingFill); 
path.addRoundedRect(rect, 5, 5); 
qreal squareSize = height/2; 
path.addRect(QRect(left, top+height-squareSize, squareSize, squareSize)); // Bottom left 
path.addRect(QRect((left+width)-squareSize, top+height-squareSize, squareSize, squareSize)); // Bottom right 
painter->drawPath(path.simplified()); // Draw box (only rounded at top)