2012-06-19 16 views
8

Sto tentando di creare un widget costituito da un'unica linea nera orizzontale. Questo widget verrà inserito in un QGridLayout in modo tale da occupare l'intera riga, agendo quindi come separatore. Poiché il widget su cui è installato il layout viene ridimensionato, mi piacerebbe che la linea cambiasse le sue dimensioni per tenere il passo. Ho esaminato un certo numero di opzioni, tra cui QLine, QGraphicsView e QImage, ma non riesco a ottenere il disegno della linea, non importa farlo ridimensionare.Disegno di una linea su QWidget

Sto implementando questo nella propria classe in modo da poterlo riutilizzare come e quando è necessario. Qualcuno può aiutarmi per favore con questo?

#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 questo caso, è il genitore parentQWidget su cui è installato il QGridLayout accennato in precedenza.

#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

puoi mostrarci uno screenshot di quello che sembra finora? AFAIK, non penso che puoi fare in modo che un widget occupi più posizioni in un QGridLayout, un approccio migliore potrebbe essere quello di creare una linea orizzontale e inserirla in ogni colonna (stessa riga) – eqzx

+2

Hai provato a utilizzare un QFrame con il frame forma impostata su HLine? –

+0

@RA, è esattamente quello che stavo cercando, grazie :) Se lo scrivi come risposta, vado avanti e accetto. –

risposta

10

Il modo più semplice per creare una linea orizzontale in Qt è quello di utilizzare un QFrame con la frameShape proprietà impostata a QFrame::HLine. È quindi possibile posizionare questo frame nel layout della griglia con l'intervallo di colonne appropriato. Ecco un semplice, esempio inventato:

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

Questo dovrebbe fare tutto quello che serve fare per, inclusi automaticamente ridimensionare quando il layout genitore ridimensiona. Puoi anche giocare con la tavolozza della cornice per mostrarla nel colore desiderato.

1

Errore di ortografia QPain t Evento. Il mispelling significa che la funzione paintEvent() non sovrascrive paintEvent() delle classi base.

Poiché non si utilizza mai la variabile e di "QPainEvent", non si verifica alcun errore di sintassi.

Problemi correlati