2012-06-19 45 views
8

Tôi đang cố gắng tạo tiện ích bao gồm một đường màu đen nằm ngang. Widget này sẽ được đặt trong một QGridLayout sao cho nó chiếm toàn bộ hàng, do đó đóng vai trò như một dấu tách. Là tiện ích mà trên đó bố cục được cài đặt được thay đổi kích thước, tôi muốn dòng thay đổi kích thước của nó để theo kịp. Tôi đã kiểm tra một số tùy chọn, bao gồm QLine, QGraphicsView và QImage, nhưng tôi dường như không thể vẽ được dòng, đừng bận tâm để nó thay đổi kích thước.Vẽ một đường trên một QWidget

Tôi đang triển khai tính năng này trong lớp riêng của mình để tôi có thể sử dụng lại khi cần thiết. Có ai co thể giúp tôi với điều này không?

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

Trong trường hợp này, parent là phụ huynh QWidget khi đó QGridLayout đề cập trước đó được cài đặt.

#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

bạn có thể cho chúng tôi biết ảnh chụp màn hình của những gì nó trông giống như hiện nay không? AFAIK, tôi không nghĩ rằng bạn có thể tạo một widget chiếm nhiều vị trí trong QGridLayout, một cách tiếp cận tốt hơn có thể là tạo một đường ngang và đặt nó vào mỗi cột (cùng hàng) – eqzx

+2

Bạn đã thử sử dụng QFrame với khung hình dạng thiết lập để HLine? –

+0

@RA, đó là chính xác những gì tôi đang tìm kiếm, cảm ơn :) Nếu bạn viết nó như là một câu trả lời, tôi sẽ đi trước và chấp nhận. –

Trả lời

10

Cách đơn giản nhất để tạo ra một dòng ngang trong Qt là sử dụng một QFrame với frameShape bất động sản thiết lập để QFrame::HLine. Sau đó, bạn có thể đặt khung này trong bố cục lưới của mình với khoảng cột thích hợp. Dưới đây là một ví dụ đơn giản, có nhiều tính năng:

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

Điều này sẽ làm mọi thứ bạn cần làm, bao gồm tự động thay đổi kích thước khi bố cục cha mẹ thay đổi kích thước. Bạn cũng có thể chơi với bảng màu của khung để hiển thị nó theo màu mong muốn.

1

Bạn đã viết sai chính tả QPain t Sự kiện. Lỗi chính tả có nghĩa là hàm paintEvent() của bạn không ghi đè lên lớp paintEvent() của lớp cơ sở.

Vì bạn không bao giờ sử dụng biến e của "QPainEvent", không có lỗi cú pháp.

Các vấn đề liên quan