Форум — Development Как заставить Qt рисовать вертикальный текст 0 0 Как заставить рисовать вертикальный текст в виджете? А то я в доках не нахожу. Заранее спасибо. Ссылка
Скорее всего, придется делать свой виджет. В принципе, ничего сложного. В методе paintEvent развернуть ось координат и обычным drawText вывести. ANDI ★★ (22.09.04 19:48:06 MSD) Показать ответ Ссылка
Ответ на: комментарий от ANDI 22.09.04 19:48:06 MSD буквы, я как понимаю, нужны вертикально? ну типа: Т Е С Т anonymous (23.09.04 01:58:55 MSD) Ссылка
Нет, чисто строка, повернутая на 90 градусов :) ay49Mihas (23.09.04 08:54:45 MSD) автор топика Ссылка
В примерах к Qt есть такое. Основываясь на них, можно соорудить виджет: class RotLabel : public QWidget { public: RotLabel(int angle, const QString &text, QWidget *parent); private: virtual void paintEvent(QPaintEvent *); virtual void resizeEvent(QResizeEvent *); void do_paint(); private: int angle_; QString text_; QRect erase_rect_; // covers last displayed text QWMatrix matrix_; // coordinate transform matrix }; //------------------------------------------------------------------------------ --------------- RotLabel::RotLabel(int angle, const QString &text, QWidget *parent) : QWidget(parent), angle_(angle), text_(text), erase_rect_(QRect(0, 0, 0, 0)) { matrix_.rotate(angle_); setMinimumWidth(fontMetrics().boundingRect(text_).height()); // 270 degrees } void RotLabel::paintEvent(QPaintEvent *) { do_paint(); } void RotLabel::resizeEvent(QResizeEvent *) { erase_rect_ = QRect( width()/2, height()/2, 0, 0 ); repaint(rect()); } void RotLabel::do_paint() { QPainter p; QWMatrix um; // copy user specified transform QRect br = fontMetrics().boundingRect( text_ ); // rectangle covering text QRect r = br; // rectangle covering new text in virtual coordinates int textYPos = -r.y(); // distance from boundingRect y pos to baseline int textXPos = -r.x(); // distance from boundingRect x pos to text start br.moveTopLeft( QPoint( -br.width()/2, -br.height()/2 ) ); r.moveTopLeft( QPoint(-r.width()/2, -r.height()/2) ); // compute union of new and old rect // the resulting rectangle will cover what is already displayed // and have room for the new text/pixmap erase_rect_ = erase_rect_.unite( matrix_.map(r) ); erase_rect_.moveBy( -1, -1 ); // add border for matrix round off erase_rect_.setSize( QSize( erase_rect_.width() + 2,erase_rect_.height() + 2 ) ); int pw = std::min(erase_rect_.width(),width()); int ph = std::min(erase_rect_.height(),height()); QPixmap pm( pw, ph ); // off-screen drawing pixmap pm.fill( backgroundColor() ); p.begin( &pm ); um.translate( pw/2, ph/2 ); // 0,0 is center um = matrix_ * um; p.setWorldMatrix( um ); p.setFont( font() ); // use widget font p.drawText( r.left() + textXPos, r.top() + textYPos, text_ ); p.end(); int xpos = width()/2 - pw/2; int ypos = height()/2 - ph/2; bitBlt( this, xpos, ypos, // copy pixmap to widget &pm, 0, 0, -1, -1 ); erase_rect_ = matrix_.map( r ); } hbee ★★★★ (23.09.04 10:30:42 MSD) Показать ответы Ссылка
Ответ на: комментарий от hbee 23.09.04 10:30:42 MSD Ладно, народ, спасибо большое, что откликнулись. Просто мне неохота в качестве меток на координатных осях графиков использовать виджеты. ay49Mihas (23.09.04 12:07:29 MSD) автор топика Показать ответ Ссылка
Ответ на: комментарий от ay49Mihas 23.09.04 12:07:29 MSD Дело не в виджетах, а в bitBlt() :-) hbee ★★★★ (24.09.04 10:43:42 MSD) Ссылка
Ответ на: комментарий от hbee 23.09.04 10:30:42 MSD Гм. Классно :-). Спасибо. eXOR ★★★★★ (25.09.04 18:09:17 MSD) Ссылка