2012-06-19 14 views
8

Ich versuche, ein Widget zu erstellen, das aus einer einzigen horizontalen schwarzen Linie besteht. Dieses Widget wird in einem QGridLayout platziert, sodass es die gesamte Zeile einnimmt und somit als Trennzeichen fungiert. Da das Widget, auf dem das Layout installiert wird, in der Größe angepasst wird, möchte ich, dass die Zeile ihre Größe ändert, um mitzuhalten. Ich habe eine Reihe von Optionen ausgecheckt, einschließlich QLine, QGraphicsView und QImage, aber ich kann nicht die Linie gezogen werden, geschweige denn die Größe ändern.Zeichnen einer Linie auf einem QWidget

Ich implementiere dies in seiner eigenen Klasse, so dass ich es wiederverwenden kann, wenn es benötigt wird. Kann mir bitte jemand dabei helfen?

#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); 
} 

In diesem Fall parent ist die Mutter QWidget, auf dem die QGridLayout bereits erwähnt installiert ist.

#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

können Sie uns einen Screenshot zeigen, wie es bisher aussieht? AFAIK, ich glaube nicht, dass ein Widget mehrere Positionen in einem QGridLayout aufnehmen kann, ein besserer Ansatz wäre es, eine horizontale Linie zu erstellen und in jede Spalte zu setzen (gleiche Zeile) – eqzx

+2

Haben Sie versucht, einen QFrame mit dem Rahmen zu verwenden Form auf HLine gesetzt? –

+0

@RA, das ist genau das, was ich gesucht habe, danke :) Wenn Sie es als Antwort schreiben, werde ich weitermachen und akzeptieren. –

Antwort

10

Der einfachste Weg, um eine horizontale Linie in Qt zu erstellen, ist ein QFrame mit der frameShape Eigenschaft auf QFrame::HLine Set zu verwenden. Sie können diesen Rahmen dann in Ihrem Rasterlayout mit der entsprechenden Spaltenspanne platzieren. Hier ist ein einfaches, erfundenes Beispiel:

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); 

Dies alles tun, sollten Sie sie brauchen zu tun, einschließlich automatisch die Größe, wenn das übergeordnete Layout paßt die Größe. Sie können auch mit der Rahmenpalette spielen, um sie in der gewünschten Farbe anzuzeigen.

1

Sie falsch geschrieben QPain t Ereignis. Das Fehlschlagen bedeutet, dass die Funktion paintEvent() das paintEvent() der Basisklassen nicht überschreibt.

Da Sie nie die Variable e von "QPainEvent" verwenden, gibt es keinen Syntaxfehler.