Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: spirits25 от Мая 29, 2012, 11:20



Название: Дополнение символами QLabel [РЕШЕНО]
Отправлено: spirits25 от Мая 29, 2012, 11:20
Необходимо забить всё пустое пространство QLabel точками. должно быть как содержание в книге http://www.aov.ru/images/Bigpic/33_600.gif (http://www.aov.ru/images/Bigpic/33_600.gif), то есть строки разные, но после последнего символа всё пустое пространство занимают точки. Как это реализовать?


Название: Re: Дополнение символами QLabel
Отправлено: V1KT0P от Мая 29, 2012, 11:28
Необходимо забить всё пустое пространство QLabel точками. должно быть как содержание в книге http://www.aov.ru/images/Bigpic/33_600.gif (http://www.aov.ru/images/Bigpic/33_600.gif), то есть строки разные, но после последнего символа всё пустое пространство занимают точки. Как это реализовать?
Я бы под точки выделил еще один лабел. Сделал выравнивание по правому краю. После изменения основного лабела производил бы расчет нужного количества точек и заполнял бы второй лабел точками. И еще третий лабел под номер. И в итоге запихнул бы это все в один виджет =).


Название: Re: Дополнение символами QLabel
Отправлено: GreatSnake от Мая 29, 2012, 11:35
Имхо, проще на 2-й виджет наложить текстуру из точки либо вообще отрисовать QPen-ом с Qt::DotLine.
Либо создать свой виджет в котором отрисовывать текст и дорисовывать точки.


Название: Re: Дополнение символами QLabel
Отправлено: spirits25 от Мая 29, 2012, 11:52
Имхо, проще на 2-й виджет наложить текстуру из точки либо вообще отрисовать QPen-ом с Qt::DotLine.
Либо создать свой виджет в котором отрисовывать текст и дорисовывать точки.
Можно пример?


Название: Re: Дополнение символами QLabel
Отправлено: GreatSnake от Мая 29, 2012, 12:45
Код
C++ (Qt)
#include <QApplication>
#include <QPainter>
#include <QPaintEvent>
#include <QWidget>
#include <QGridLayout>
#include <QLabel>
 
class ContentsLabel : public QWidget
{
public:
ContentsLabel( const QString& s, QWidget* p = 0 )
: QWidget( p )
, text_( s ) {}
 
QSize sizeHint() const
{
br_ = QFontMetrics( font() ).boundingRect( text_ );
return br_.size();
}
void setDotColor( const QColor& clr )
{
dot_clr_ = clr;
update();
}
 
protected:
void paintEvent( QPaintEvent* e )
{
QPainter p( this );
QFontMetrics fm = p.fontMetrics();
int y = ( height() - br_.height() ) / 2 + fm.ascent();
p.drawText( 0, y, text_ );
int dot_w = fm.width( '.' );
if( dot_clr_ != QColor() )
p.setPen( dot_clr_ );
for( int x = br_.width() + 1; x < width(); x += dot_w )
p.drawText( x, y, "." );
}
 
private:
QString text_;
mutable QRect br_;
QColor dot_clr_;
};
 
int main( int argc, char** argv )
{
QApplication app( argc, argv );
QWidget w;
QGridLayout l( &w );
 
for( int i = 0; i < 20; i++ )
{
ContentsLabel* cl = new ContentsLabel( QString( "Contents text [%1]" ).arg( i + 1 ) );
cl->setDotColor( Qt::blue );
l.addWidget( cl, i, 0 );
QLabel* pl = new QLabel( QString::number( i + 1 ) );
pl->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
l.addWidget( pl, i, 1 );
}
w.show();
 
return app.exec();
}
 


Название: Re: Дополнение символами QLabel
Отправлено: spirits25 от Мая 29, 2012, 15:54
Спасибо, всё работает. А как можно точки другим цветом отобразить? текст чёрным, а точки серым, но чтобы это оставался один QLabel?


Название: Re: Дополнение символами QLabel
Отправлено: GreatSnake от Мая 29, 2012, 17:22
Ну а чего, думалка совсем не хочет думать? Всё же просто. См. правку выше.