Название: Дерево в QListBox
Отправлено: gaara от Июль 04, 2009, 09:37
Добрый день!
Вот два QListView - первый в QT 3.3, второй в QT 4.5
Почему в QT 4.5 нет линий и плюсика возле корневых веток? Что нужно сделать, чтоб они появились? Вернее плюсик и линии есть, но только возле первого узла, а возле остальных нету..
Название: Re: Дерево в QListBox
Отправлено: ритт от Июль 04, 2009, 10:50
а почему QListView, а не QTreeView? не уверен на счёт первого, а во втором всё в порядке, вроде бы...
Название: Re: Дерево в QListBox
Отправлено: lit-uriy от Июль 04, 2009, 11:06
Я думаю дело в стиле.
Название: Re: Дерево в QListBox
Отправлено: gaara от Июль 04, 2009, 12:17
Константин,
дело в том, что это исходники джаббер-клиента (PSI), в котором нужно сделать дерево.. поэтому и QListView.. раньше была версия клиента 0.9.3 и ее специально меняли, чтоб было такое дерево, а теперь вот переходим на новую версию, и в дереве не видно всех плюсиков
>> не уверен на счёт первого, а во втором всё в порядке, вроде бы... т.е. первый вариант - это самостоятельные переделки, а второй такой, какой и должен быть?
Название: Re: Дерево в QListBox
Отправлено: gaara от Июль 04, 2009, 12:18
lit-uriy,
дело в том, что в втором варианте плюсик и линии рисуются, но только для первого нода.. почему тогда для других не рисуются?
Название: Re: Дерево в QListBox
Отправлено: lit-uriy от Июль 04, 2009, 13:08
Во-втором варианте, используется QTreeView, а не QListView. Т.к. в последнем дерево отобразить нельзя (в Qt4).
Дерево, по умолчанию, рисует для всех узлов и линии и плюсики. Стало быть поведение представления было умышленно изменено. Возможно стилями или вовсе наследованием.
Подтверждение тому: Вместо "плюсиков" сделаны треуголиники, т.е. стиль "плюсиков" просто изменён
Название: Re: Дерево в QListBox
Отправлено: gaara от Июль 06, 2009, 09:19
и в первом и в втором варианте используется QListView первый вариант class ContactView : public QListView, public QToolTip { Q_OBJECT public: ContactView(QWidget *parent=0, const char *name=0); ~ContactView(); второй вариант class ContactView : public Q3ListView { Q_OBJECT public: ContactView(QWidget *parent=0, const char *name=0); ~ContactView(); если в QT4 дерево отобразить нельзя, почему тогда для первого нода рисуется плюс и линии?
Название: Re: Дерево в QListBox
Отправлено: ритт от Июль 06, 2009, 09:29
если в QT4 дерево отобразить нельзя...
кто сказал?
Название: Re: Дерево в QListBox
Отправлено: gaara от Июль 06, 2009, 09:32
Во-втором варианте, используется QTreeView, а не QListView. Т.к. в последнем дерево отобразить нельзя (в Qt4).
Дерево, по умолчанию, рисует для всех узлов и линии и плюсики. Стало быть поведение представления было умышленно изменено. Возможно стилями или вовсе наследованием.
Подтверждение тому: Вместо "плюсиков" сделаны треуголиники, т.е. стиль "плюсиков" просто изменён
Название: Re: Дерево в QListBox
Отправлено: gaara от Июль 06, 2009, 09:33
ой.. сорри всем... вместо QListBox имелось в виду QListView...
Название: Re: Дерево в QListBox
Отправлено: ритт от Июль 06, 2009, 09:34
очему тогда для первого нода рисуется плюс и линии? ContactViewItem::paint*
Название: Re: Дерево в QListBox
Отправлено: gaara от Июль 06, 2009, 09:40
первый вариант void ContactViewItem::paintFocus(QPainter *, const QColorGroup &, const QRect &) { // re-implimented to do nothing. selection is enough of a focus }
/* void ContactViewItem::paintBranches(QPainter *p, const QColorGroup &cg, int w, int, int h) { // paint a square of nothing p->fillRect(0, 0, w, h, cg.base()); } */
void ContactViewItem::paintCell(QPainter *p, const QColorGroup & cg, int column, int width, int alignment) { if ( d->type == Contact ) { QColorGroup xcg = cg;
if(d->status == STATUS_AWAY || d->status == STATUS_XA) xcg.setColor(QColorGroup::Text, option.color[cAway]); else if(d->status == STATUS_DND) xcg.setColor(QColorGroup::Text, option.color[cDND]); else if(d->status == STATUS_OFFLINE) xcg.setColor(QColorGroup::Text, option.color[cOffline]);
if(d->animatingNick) { xcg.setColor(QColorGroup::Text, d->animateNickColor ? option.color[cAnimFront] : option.color[cAnimBack]); xcg.setColor(QColorGroup::HighlightedText, d->animateNickColor ? option.color[cAnimFront] : option.color[cAnimBack]); }
QListViewItem::paintCell(p, xcg, column, width, alignment);
QFontMetrics fm(p->font()); const QPixmap *pix = pixmap(column); int x = fm.width(text(column)) + (pix ? pix->width() : 0) + 8;
if ( d->u ) { UserResourceList::ConstIterator it = d->u->priority(); if(it != d->u->userResourceList().end()) { if(d->u->isSecure((*it).name())) { const QPixmap &pix = IconsetFactory::iconPixmap("psi/cryptoYes"); int y = (height() - pix.height()) / 2; p->drawPixmap(x, y, pix); x += 24; } } } } else if ( d->type == Group || d->type == Profile ) { QColorGroup xcg = cg; xcg.setColor(QColorGroup::Text, option.color[cGroupFore]);
if(d->type == Group && option.clNewHeadings) { //xcg.setColor(QColorGroup::Text, option.color[cGroupBack]); QFont f = p->font(); f.setPointSize(option.smallFontSize); p->setFont(f); } else { //xcg.setColor(QColorGroup::Text, option.color[cGroupFore]); //xcg.setColor(QColorGroup::Base, option.color[cGroupBack]); }
QListViewItem::paintCell(p, xcg, column, width, alignment);
QFontMetrics fm(p->font()); const QPixmap *pix = pixmap(column); int x = fm.width(text(column)) + (pix ? pix->width() : 0) + 8;
if(d->type == Profile) { const QPixmap &pix = d->ssl ? IconsetFactory::iconPixmap("psi/cryptoYes") : IconsetFactory::iconPixmap("psi/cryptoNo"); int y = (height() - pix.height()) / 2; p->drawPixmap(x, y, pix); x += 24; }
if(isSelected()) p->setPen(xcg.highlightedText()); else p->setPen(xcg.text());
int y = ((height() - fm.height()) / 2) + fm.ascent(); p->drawText(x, y, d->groupInfo);
if(d->type == Group && option.clNewHeadings && !isSelected()) { x += fm.width(d->groupInfo) + 8; if(x < width - 8) { int h = (height() / 2) - 1; p->setPen(QPen(option.color[cGroupBack])); p->drawLine(x, h, width - 8, h); h++; p->setPen(QPen(option.color[cGroupFore])); /*int h = height() / 2;
p->setPen(QPen(option.color[cGroupBack], 2));*/ p->drawLine(x, h, width - 8, h); } } else { p->setPen(QPen(option.color[cGroupFore])); //p->drawRect(0, 0, width, height()); } } } второй вариант void ContactViewItem::paintFocus(QPainter *, const QColorGroup &, const QRect &) { // re-implimented to do nothing. selection is enough of a focus }
void ContactViewItem::paintBranches(QPainter *p, const QColorGroup &cg, int w, int, int h) { // paint a square of nothing p->fillRect(0, 0, w, h, cg.base()); }
void ContactViewItem::paintCell(QPainter *p, const QColorGroup & cg, int column, int width, int alignment) { if ( type_ == Contact ) { QColorGroup xcg = cg;
if(d->status == STATUS_AWAY || d->status == STATUS_XA) xcg.setColor(QColorGroup::Text, PsiOptions::instance()->getOption("options.ui.look.colors.contactlist.status.away").value<QColor>()); else if(d->status == STATUS_DND) xcg.setColor(QColorGroup::Text, PsiOptions::instance()->getOption("options.ui.look.colors.contactlist.status.do-not-disturb").value<QColor>()); else if(d->status == STATUS_OFFLINE) xcg.setColor(QColorGroup::Text, PsiOptions::instance()->getOption("options.ui.look.colors.contactlist.status.offline").value<QColor>());
if(d->animatingNick) { xcg.setColor(QColorGroup::Text, d->animateNickColor ? PsiOptions::instance()->getOption("options.ui.look.contactlist.status-change-animation.color1").value<QColor>() : PsiOptions::instance()->getOption("options.ui.look.contactlist.status-change-animation.color2").value<QColor>()); xcg.setColor(QColorGroup::HighlightedText, d->animateNickColor ? PsiOptions::instance()->getOption("options.ui.look.contactlist.status-change-animation.color1").value<QColor>() : PsiOptions::instance()->getOption("options.ui.look.contactlist.status-change-animation.color2").value<QColor>()); }
RichListViewItem::paintCell(p, xcg, column, width, alignment);
int x; if (d->status_single) x = widthUsed(); else { QFontMetrics fm(p->font()); const QPixmap *pix = pixmap(column); x = fm.width(text(column)) + (pix ? pix->width() : 0) + 8; }
if ( d->u ) { UserResourceList::ConstIterator it = d->u->priority(); if(it != d->u->userResourceList().end()) { if(d->u->isSecure((*it).name())) { const QPixmap &pix = IconsetFactory::iconPixmap("psi/cryptoYes"); int y = (height() - pix.height()) / 2; p->drawPixmap(x, y, pix); x += 24; } } } } else if ( type_ == Group || type_ == Profile ) { QColorGroup xcg = cg;
if(type_ == Profile) { xcg.setColor(QColorGroup::Text, PsiOptions::instance()->getOption("options.ui.look.colors.contactlist.profile.header-foreground").value<QColor>()); #if QT_VERSION < 0x040301 xcg.setColor(QColorGroup::Background, PsiOptions::instance()->getOption("options.ui.look.colors.contactlist.profile.header-background").value<QColor>()); #else xcg.setColor(QColorGroup::Base, PsiOptions::instance()->getOption("options.ui.look.colors.contactlist.profile.header-background").value<QColor>()); #endif } else if(type_ == Group) { QFont f = p->font(); f.setPointSize(common_smallFontSize); p->setFont(f); xcg.setColor(QColorGroup::Text, PsiOptions::instance()->getOption("options.ui.look.colors.contactlist.grouping.header-foreground").value<QColor>()); if (!PsiOptions::instance()->getOption("options.ui.look.contactlist.use-slim-group-headings").toBool()) { #if QT_VERSION < 0x040301 xcg.setColor(QColorGroup::Background, PsiOptions::instance()->getOption("options.ui.look.colors.contactlist.grouping.header-background").value<QColor>()); #else xcg.setColor(QColorGroup::Base, PsiOptions::instance()->getOption("options.ui.look.colors.contactlist.grouping.header-background").value<QColor>()); #endif } }
Q3ListViewItem::paintCell(p, xcg, column, width, alignment);
QFontMetrics fm(p->font()); const QPixmap *pix = pixmap(column); int x = fm.width(text(column)) + (pix ? pix->width() : 0) + 8;
if(type_ == Profile) { const QPixmap &pix = d->ssl ? IconsetFactory::iconPixmap("psi/cryptoYes") : IconsetFactory::iconPixmap("psi/cryptoNo"); int y = (height() - pix.height()) / 2; p->drawPixmap(x, y, pix); x += 24; }
if(isSelected()) p->setPen(xcg.highlightedText()); else p->setPen(xcg.text());
QFont f_info = p->font(); f_info.setPointSize(common_smallFontSize); p->setFont(f_info); QFontMetrics fm_info(p->font()); //int info_x = width - fm_info.width(d->groupInfo) - 8; int info_x = x; int info_y = ((height() - fm_info.height()) / 2) + fm_info.ascent(); p->drawText((info_x > x ? info_x : x), info_y, d->groupInfo);
if(type_ == Group && PsiOptions::instance()->getOption("options.ui.look.contactlist.use-slim-group-headings").toBool() && !isSelected()) { x += fm.width(d->groupInfo) + 8; if(x < width - 8) { int h = (height() / 2) - 1; p->setPen(QPen(PsiOptions::instance()->getOption("options.ui.look.colors.contactlist.grouping.header-background").value<QColor>())); p->drawLine(x, h, width - 8, h); h++; p->setPen(QPen(PsiOptions::instance()->getOption("options.ui.look.colors.contactlist.grouping.header-foreground").value<QColor>())); /*int h = height() / 2;
p->setPen(QPen(PsiOptions::instance()->getOption("options.ui.look.colors.contactlist.grouping.header-background").value<QColor>(), 2));*/ p->drawLine(x, h, width - 8, h); } } else { if (PsiOptions::instance()->getOption("options.ui.look.contactlist.use-outlined-group-headings").toBool()) { p->setPen(QPen(PsiOptions::instance()->getOption("options.ui.look.colors.contactlist.grouping.header-foreground").value<QColor>())); p->drawRect(0, 0, width, height()); } }
} }
Название: Re: Дерево в QListBox
Отправлено: lit-uriy от Июль 06, 2009, 09:50
gaara, я препологал, что вы полностью на 4-ку портируете. Может так и стоит сделать? Т.е. отказатся от Q3ListView и полностью переписать на основе QTreeView?
Название: Re: Дерево в QListBox
Отправлено: gaara от Июль 07, 2009, 12:55
разобрался.. надо было всего лишь убрать paintBranches
|