Russian Qt Forum
Апрель 25, 2024, 03:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как задать атрибуты для QTreeWidgetItem ?  (Прочитано 7244 раз)
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« : Апрель 14, 2015, 13:07 »

Добрый день. У меня появилась необходимость задавать для  QTreeWidgetItem цвет фона, цвет текста, цвет выделенного фона и текста. Можно ли как-то это сделать, не задавая их всему QTreeWidget?
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #1 : Апрель 14, 2015, 13:25 »

Нашел как для невыделенного item-а сделать:
Код:
    item->setFont(index, font);
    item->setTextColor(index, colorText);
    item->setBackgroundColor(item, colorFill);
А как для выделенного? пока не знаю.
Записан
Bepec
Гость
« Ответ #2 : Апрель 14, 2015, 13:47 »

1. Можно устанавливать роли при выделении/снятии выделения.
    псевдокод setData(0, Qt::BackgroundRole, Qt::red);

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

Сообщений: 306


Просмотр профиля
« Ответ #3 : Апрель 14, 2015, 14:27 »

setStyleSheet наверное не пойдет, так как мне нужно не всем item-ам задавать цвет фона и текста, а только конкретному.
Записан
Bepec
Гость
« Ответ #4 : Апрель 14, 2015, 14:36 »

StyleSheet позволяет привязываться к данным item'а, но тут уже вопрос что вам надо и так далее.

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

Сообщений: 306


Просмотр профиля
« Ответ #5 : Апрель 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-у который я не посылаю в свою функцию.
Записан
Bepec
Гость
« Ответ #6 : Апрель 14, 2015, 17:44 »

Вот когда вы четко желалку сформулируете, понятную такую с картинками и тестовым проектом, тогда вместе и реализуем.

PS я болею,  навык написания ТЗ по смутным намекам выключен Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Апрель 14, 2015, 18:00 »

Билли Джонс, в Qt масса вкусных плюшек, и настораживает аппетит с которым Вы их едите  Улыбающийся Ну не увлекайтесь так, это всего лишь плюшки, программирования они не заменят.
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #8 : Апрель 14, 2015, 23:41 »

Вот когда вы четко желалку сформулируете, понятную такую с картинками и тестовым проектом, тогда вместе и реализуем.

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

- 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.
Записан
Bepec
Гость
« Ответ #9 : Апрель 15, 2015, 12:30 »

Стандартно побурчу - выложить проект, это выложить архив с файлами проекта, а не зафигачить стену текста и картинку Веселый
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #10 : Апрель 15, 2015, 13:25 »

Стандартно побурчу - выложить проект, это выложить архив с файлами проекта, а не зафигачить стену текста и картинку Веселый
ну это кому как)) мне и кода хватает) учту, буду архив бросать в следующие разы) просто тут примерчик маленький.
Записан
Bepec
Гость
« Ответ #11 : Апрель 15, 2015, 13:39 »

Ну примерно так, во всяком случае направление задал, дальше сами разбирайтесь Веселый
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #12 : Апрель 16, 2015, 14:51 »

Ну примерно так, во всяком случае направление задал, дальше сами разбирайтесь Веселый
Bepec, спасибо. Буду разбираться.
Записан
MaxoBik
Гость
« Ответ #13 : Апрель 18, 2015, 17:10 »

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

Сообщений: 306


Просмотр профиля
« Ответ #14 : Апрель 28, 2015, 23:41 »

MaxoBik, спасибо учту.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.105 секунд. Запросов: 23.