2012-03-27 30 views
1

我有一個QPainter和一個矩形。Qt:如何繪製虛擬行編輯控件

我想繪製一個QLineEdit控件,爲空。只是爲了繪製它,而不是實時控制。我怎麼做?我試過QStyle :: drawPrimitive無濟於事。沒有任何東西被繪製

QStyleOption option1; 
option1.init(contactsView); // contactView is the parent QListView 
option1.rect = option.rect; // option.rect is the rectangle to be drawn on. 
contactsView->style()->drawPrimitive(QStyle::PE_FrameLineEdit, &option1, painter, contactsView); 

當然,我想繪製的虛擬外觀在Windows和OSX本地化。

+0

你可以創建一個真正的'QLineEdit',然後設置'qlineedit-> setEnabled(false)'?或者這不會爲您的目的生成正確的行爲/外觀?很好地做了這個技巧的 – tmpearce 2012-03-27 23:03:36

回答

1

您的代碼非常接近,但您必須從假QLineEdit初始化樣式。以下內容基於QLineEdit::paintEventQLineEdit::initStyleOption

#include <QtGui> 

class FakeLineEditWidget : public QWidget { 
public: 
    explicit FakeLineEditWidget(QWidget *parent = NULL) : QWidget(parent) {} 
protected: 
    void paintEvent(QPaintEvent *) { 
    QPainter painter(this); 

    QLineEdit dummy; 

    QStyleOptionFrameV2 panel; 
    panel.initFrom(&dummy); 
    panel.rect = QRect(10, 10, 100, 30); // QFontMetric could provide height. 
    panel.lineWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth, 
              &panel, 
              &dummy); 
    panel.midLineWidth = 0; 
    panel.state |= QStyle::State_Sunken; 
    panel.features = QStyleOptionFrameV2::None; 

    style()->drawPrimitive(QStyle::PE_PanelLineEdit, &panel, &painter, this); 
    } 
}; 

int main(int argc, char **argv) { 
    QApplication app(argc, argv); 

    FakeLineEditWidget w; 
    w.setFixedSize(300, 100); 
    w.show(); 

    return app.exec(); 
} 
+0

。謝謝。 – JasonGenX 2012-03-28 14:20:14