Russian Qt Forum

Qt => Вопросы новичков => Тема начата: billy4685 от Апрель 14, 2015, 13:07



Название: Как задать атрибуты для QTreeWidgetItem ?
Отправлено: billy4685 от Апрель 14, 2015, 13:07
Добрый день. У меня появилась необходимость задавать для  QTreeWidgetItem цвет фона, цвет текста, цвет выделенного фона и текста. Можно ли как-то это сделать, не задавая их всему QTreeWidget?


Название: Re: Как задать атрибуты для QTreeWidgetItem ?
Отправлено: billy4685 от Апрель 14, 2015, 13:25
Нашел как для невыделенного item-а сделать:
Код:
    item->setFont(index, font);
    item->setTextColor(index, colorText);
    item->setBackgroundColor(item, colorFill);
А как для выделенного? пока не знаю.


Название: Re: Как задать атрибуты для QTreeWidgetItem ?
Отправлено: Bepec от Апрель 14, 2015, 13:47
1. Можно устанавливать роли при выделении/снятии выделения.
    псевдокод setData(0, Qt::BackgroundRole, Qt::red);

2. Можно посмотреть в сторону StyleSheet с ихними селекторами
    псевдокод setStyleSheet("::item:selected{background-color:#FF0000;}");


Название: Re: Как задать атрибуты для QTreeWidgetItem ?
Отправлено: billy4685 от Апрель 14, 2015, 14:27
setStyleSheet наверное не пойдет, так как мне нужно не всем item-ам задавать цвет фона и текста, а только конкретному.


Название: Re: Как задать атрибуты для QTreeWidgetItem ?
Отправлено: Bepec от Апрель 14, 2015, 14:36
StyleSheet позволяет привязываться к данным item'а, но тут уже вопрос что вам надо и так далее.

PS к примеру айтему можно добавить свойство, по которому стиль будет применяться или же не применяться.


Название: Re: Как задать атрибуты для QTreeWidgetItem ?
Отправлено: billy4685 от Апрель 14, 2015, 16:15
Да функцию создаю, в которую посылаю сам item, цвет текста и цвет фона. Таких функций две, одна для невыделенного режима, вторая для выделенного. Item-ов в самом TreeWidget много.
Пока вот, благодаря Вашим советам, сделал для невыделенного через стандартные функции item->setBackgroundColor(index, colorFill) и item->setTextColor(index, colorText), по идеи и для выделенного тоже как-то должно. Но пока для выделенного у меня выходит только через treeWidget->setStyleSheet(QString("QTreeWidget::item:selected {background-color: %1; color: %2}").arg(colorFill).arg(colorText)). Но это не совсем то что мне нужно, так как этот стиль будет задаваться всем выделяеммым, и тому item-у который я не посылаю в свою функцию.


Название: Re: Как задать атрибуты для QTreeWidgetItem ?
Отправлено: Bepec от Апрель 14, 2015, 17:44
Вот когда вы четко желалку сформулируете, понятную такую с картинками и тестовым проектом, тогда вместе и реализуем.

PS я болею,  навык написания ТЗ по смутным намекам выключен :D


Название: Re: Как задать атрибуты для QTreeWidgetItem ?
Отправлено: Igors от Апрель 14, 2015, 18:00
Билли Джонс, в Qt масса вкусных плюшек, и настораживает аппетит с которым Вы их едите  :) Ну не увлекайтесь так, это всего лишь плюшки, программирования они не заменят.


Название: Re: Как задать атрибуты для QTreeWidgetItem ?
Отправлено: billy4685 от Апрель 14, 2015, 23:41
Вот когда вы четко желалку сформулируете, понятную такую с картинками и тестовым проектом, тогда вместе и реализуем.

PS я болею,  навык написания ТЗ по смутным намекам выключен :D
Ну вот к примеру код небольшого приложения:

- mainwindow.h
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QStringList>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);

    // эти функции задают цвет фона и текста для не выделенного item-а
    void setUnselColorText(QTreeWidgetItem *item, QColor colorText);
    void setUnselColorFill(QTreeWidgetItem *item, QColor colorFill);

    // эти две функции не могу реализовать: должны задавать цвет фона и текста для  выделенния item-а,
    // если для него я применю данные функции
    void setSelectColorText(QTreeWidgetItem *item, QColor colorText);
    void setSelectColorFill(QTreeWidgetItem *item, QColor colorFill);

private:
    QTreeWidget *treeWidget;
    QTreeWidgetItem *item1;
    QTreeWidgetItem *item2;
    QTreeWidgetItem *item3;
    QStringList elements;
};

#endif // MAINWINDOW_H

- mainwindow.ccp
Код:
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    setFixedSize(200, 200);
    move(150, 150);

    treeWidget = new QTreeWidget(this);
    treeWidget->setFixedSize(180, 180);
    treeWidget->move(10, 10);

    elements << "Column1" << "Column2" << "Column2";
    treeWidget->setHeaderLabels(elements);
    treeWidget->setColumnCount(3);

    for(int i=0; i<3; i++)
        treeWidget->setColumnWidth(i, 55);

    treeWidget->show();

    elements.clear();
    elements << "11" << "12" << "13";
    item1 = new QTreeWidgetItem(elements);
    treeWidget->addTopLevelItem(item1);

    elements.clear();
    elements << "21" << "22" << "23";
    item2 = new QTreeWidgetItem(elements);
    treeWidget->addTopLevelItem(item2);
    setUnselColorFill(item2, Qt::green);
    setUnselColorText(item2, Qt::red);

    elements.clear();
    elements << "31" << "32" << "33";
    item3 = new QTreeWidgetItem(elements);
    treeWidget->addTopLevelItem(item3);
}

void MainWindow::setUnselColorText(QTreeWidgetItem *item, QColor colorText)
{
    for(int i=0; i<3; i++)
        item->setTextColor(i, colorText);
}

void MainWindow::setUnselColorFill(QTreeWidgetItem *item, QColor colorFill)
{
    for(int i=0; i<3; i++)
        item->setBackgroundColor(i, colorFill);
}

void MainWindow::setSelectColorText(QTreeWidgetItem *item, QColor colorText)
{
    // не знаю как реализовать
}

void MainWindow::setSelectColorFill(QTreeWidgetItem *item, QColor colorFill)
{
    // не знаю как реализовать
}

- main.cpp
Код:
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

Ниже на рисунке результат кода. То есть для не выделенного item-а (в примере item2) цвет фона и текста удается задать (зеленый и красный соответственно). А хотелось бы, чтобы можно так же было задавать цвет фона и текста для выделения item-a (к примеру тому же item2). Стандартное выделение любого item-а в QTreeWidget в Qt реализовано синим цветом фона и белым текстом (ну наверное еще зависит от темы в Windows или Linux). А я хочу задавать свой к примеру только для item2.


Название: Re: Как задать атрибуты для QTreeWidgetItem ?
Отправлено: Bepec от Апрель 15, 2015, 12:30
Стандартно побурчу - выложить проект, это выложить архив с файлами проекта, а не зафигачить стену текста и картинку :D


Название: Re: Как задать атрибуты для QTreeWidgetItem ?
Отправлено: billy4685 от Апрель 15, 2015, 13:25
Стандартно побурчу - выложить проект, это выложить архив с файлами проекта, а не зафигачить стену текста и картинку :D
ну это кому как)) мне и кода хватает) учту, буду архив бросать в следующие разы) просто тут примерчик маленький.


Название: Re: Как задать атрибуты для QTreeWidgetItem ?
Отправлено: Bepec от Апрель 15, 2015, 13:39
Ну примерно так, во всяком случае направление задал, дальше сами разбирайтесь :D


Название: Re: Как задать атрибуты для QTreeWidgetItem ?
Отправлено: billy4685 от Апрель 16, 2015, 14:51
Ну примерно так, во всяком случае направление задал, дальше сами разбирайтесь :D
Bepec, спасибо. Буду разбираться.


Название: Re: Как задать атрибуты для QTreeWidgetItem ?
Отправлено: MaxoBik от Апрель 18, 2015, 17:10
setStyleSheet наверное не пойдет, так как мне нужно не всем item-ам задавать цвет фона и текста, а только конкретному.
Можно и с помощью декларатива(StyleSheet) задавать, только вот беда в том, что QTreeWidgetItem не наследует от QObject, и привязаться к конкретному QTreeWidgetItem с помощью декларатива(через ID Selector #objectName или Property Selector [PropertyName=PropertyValue] и setProperty) не получится.
Можно создать свой класс, который будет наследовать QTreeWidgetItem и QObject.
Также можно использовать QStyledItemDelegate, но это другая история.
А вообще StyleSheet подходит к статичным данным, а у вас судя повсему динамические данные, такое лучше всего перекинуть на модель.


Название: Re: Как задать атрибуты для QTreeWidgetItem ?
Отправлено: billy4685 от Апрель 28, 2015, 23:41
MaxoBik, спасибо учту.