2012-06-19 15 views
8

Próbuję utworzyć widget składający się z pojedynczej poziomej czarnej linii. Ten widget zostanie umieszczony w QGridLayout tak, że zajmie cały wiersz, działając w ten sposób jako separator. Ponieważ widget, na którym jest zainstalowany układ, jest zmieniany, chciałbym, aby linia zmieniła jego rozmiar, aby nadążyć. Sprawdziłem kilka opcji, w tym QLine, QGraphicsView i QImage, ale nie mogę uzyskać rysowania linii, nieważne, aby zmienić rozmiar.Rysowanie linii na QWidget

Wdrażam to w swojej własnej klasie, więc mogę go użyć ponownie, kiedy jest potrzebny. Czy ktoś może mi w tym pomóc?

#include "startMenuSectionFooter.h" 

#include <QtGui> 

StartMenuSectionFooter::StartMenuSectionFooter(QWidget *parent) 
    : QWidget(parent) 
{ 
    layout = new QHBoxLayout(this); 
} 

void StartMenuSectionFooter::paintEvent(QPainEvent *e) 
{ 
    QPointF p1 = QPointF(parentWidget()->height(), 0); 
    QPointF p2 = QPointF(parentWidget()->height(), parentWidget()->width()); 

    QPainter painter(this); 
    painter.setRenderHint(QPainter::Antialiasing, true); 
    painter.setPen(QPen(Qt::black, 10)); 

    painter.drawLine(p1, p2); 
} 

W tym przypadku parent jest rodzicem QWidget na którym QGridLayout wspomniano wcześniej jest zainstalowany.

#ifndef START_MENU_SECTION_FOOTER_H 
#define START_MENU_SECTION_FOOTER_H 

#include <QWidget> 

class QHBoxLayout; 
class QPainEvent; 

class StartMenuSectionFooter : public QWidget 
{ 
    Q_OBJECT 

    QBHoxLayout *layout; 

    void paintEvent(QPainEvent *e); 

public: 
    StartMenuSectionFooter(QWidget *parent = NULL); 
}; 

#endif 
+0

Czy możesz pokazać zrzut ekranu, jak to wygląda? AFAIK, nie sądzę, że możesz sprawić, że widget zajmie wiele lokalizacji w QGridLayout, lepszym rozwiązaniem może być utworzenie poziomej linii i umieszczenie jej w każdej kolumnie (ten sam wiersz). – eqzx

+2

Czy próbowałeś używać QFrame z ramką? kształt ustawiony na HLine? –

+0

@RA, to dokładnie to, czego szukałem, dzięki :) Jeśli napiszesz to jako odpowiedź, przyjdę i zaakceptuję. –

Odpowiedz

10

Najprostszym sposobem, aby utworzyć linię poziomą w Qt jest użycie QFrame z właściwością frameShape ustawiony QFrame::HLine. Następnie możesz umieścić tę ramkę w układzie siatki z odpowiednią rozpiętością kolumn. Oto prosty, wymyślony przykład:

QFrame* myFrame = new QFrame(); 
myFrame->setFrameShape(QFrame::HLine); 

const int NUMBER_OF_COLUMNS_IN_GRID = 4; 
myGridLayout->addWidget(myFrame, 0, 0, 1, NUMBER_OF_COLUMNS_IN_GRID); 

ten powinien zrobić wszystko, czego potrzeba, aby to zrobić, w tym automatycznie zmienić rozmiar, gdy układ nadrzędny zmienia rozmiar. Możesz także odtwarzać paletą ramki, aby pokazać ją w wybranym kolorze.

1

Błędnie napisane QPain t Wydarzenie. Błędne oznaczenie oznacza, że ​​twoja funkcja paintEvent() nie zastępuje klasy paintEvent() klasy podstawowej.

Ponieważ nigdy nie używasz zmiennej e "QPainEvent", nie ma błędu składni.

Powiązane problemy