Как рисовать в клетке таблицы QTableWidget?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 25.07.22 09:43
Оценка:
Как программно рисовать в клетке таблицы QTableWidget?
1613 г. = 2024 г.
Re: Как рисовать в клетке таблицы QTableWidget?
От: DiPaolo Россия  
Дата: 25.07.22 10:02
Оценка: +1
RF>Как программно рисовать в клетке таблицы QTableWidget?

Пара советов:
1. описывайте тут, что именно вы хотите получить. Потому что порой средства достижения этого могут быть совсем не теми, какими вы себе представляете. А тут вам подскажут.
2. кастомизируйте элемент Qt в самую последнюю очередь и только лишь в крайних случаях. По умолчанию Qt очень красиво и консистентно сделан, в результате чего интерфейс смотрится последовательно и аккуратно на всех системах. Внося кастомизацию, вы можете ухудшить внешний вид приложения, поиметь много геморроя, и столкнуться с проблемами в разных ОСях.

Ответ на ваш вопрос зависит от того, что вы хотите:
1. может помочь применение методов
 void QTableWidgetItem::setForeground(const QBrush &brush)

и
void QTableWidgetItem::setBackground(const QBrush &brush)

(https://doc.qt.io/qt-6/qtablewidgetitem.html)
если нужны достаточно простые формы или просто закраска/градиент.

2. либо же перейти на Model-View (т.е. QTableView + модель + делегат). Привет рисования в делегате тут https://doc.qt.io/qt-6/qtwidgets-itemviews-stardelegate-example.html
Патриот здравого смысла
Re[2]: Как рисовать в клетке таблицы QTableWidget?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 27.07.22 05:21
Оценка:
Здравствуйте, DiPaolo, Вы писали:

RF>>Как программно рисовать в клетке таблицы QTableWidget?


DP>Пара советов:

DP>1. описывайте тут, что именно вы хотите получить. Потому что порой средства достижения этого могут быть совсем не теми, какими вы себе представляете. А тут вам подскажут.

Есть некоторая таблица, у которой есть строки. И в каждой строке этой таблицы нужно закрасить часть (правую) какой-то клетки, потом закрасить полностью одну или несколько клеток (в зависимости от условия в программе), затем закрасить часть (левую) клетки, расположенной справа от этих клеток. То есть нужно раскрасить каким-то цветом (например, серым) часть клеток в строке таблицы. Как это сделать?
1613 г. = 2024 г.
Re[3]: Как рисовать в клетке таблицы QTableWidget?
От: DiPaolo Россия  
Дата: 27.07.22 05:50
Оценка:
RF>Есть некоторая таблица, у которой есть строки. И в каждой строке этой таблицы нужно закрасить часть (правую) какой-то клетки, потом закрасить полностью одну или несколько клеток (в зависимости от условия в программе), затем закрасить часть (левую) клетки, расположенной справа от этих клеток. То есть нужно раскрасить каким-то цветом (например, серым) часть клеток в строке таблицы. Как это сделать?

Если вы закрашиваете полностью ячейку, то используйте
void QTableWidgetItem::setBackground(const QBrush &brush)


(я на память не помню; если эта не подойдет, что тогда setForeground())

Можете разбить вашу строку на ячейки, если это подходит для вашей задачи.

Если же надо внутри ячейки закрашивать разными цветами (типа прогресс бара делать), то я бы посмотреть на пункт 2 из моего ответа выше, то есть перейти к Model-View с отрисовкой в делегате. Ссылка на пример есть выше в сообщении.
Патриот здравого смысла
Re[3]: Как рисовать в клетке таблицы QTableWidget?
От: Igore Россия  
Дата: 27.07.22 08:52
Оценка:
Здравствуйте, RussianFellow, Вы писали:

DP>>Пара советов:

DP>>1. описывайте тут, что именно вы хотите получить. Потому что порой средства достижения этого могут быть совсем не теми, какими вы себе представляете. А тут вам подскажут.

RF>Есть некоторая таблица, у которой есть строки. И в каждой строке этой таблицы нужно закрасить часть (правую) какой-то клетки, потом закрасить полностью одну или несколько клеток (в зависимости от условия в программе), затем закрасить часть (левую) клетки, расположенной справа от этих клеток. То есть нужно раскрасить каким-то цветом (например, серым) часть клеток в строке таблицы. Как это сделать?

Есть таблица, в ней есть строки, строки делятся на ячейки, в ячейках нужно рисовать разными цветами, причем не полностью ячейку но и например половину.
Так как ты выбрал QTableWidget то самый простой вариант видится использовать setCellWidget, делаешь для столбца где нужно красить часть ячейки свой виджет, который будет сделан приблизительно так:
------- ------
| wgt1 | wgt2 |
------- ------
wgt1 и wgt2 в RowLayout , цвет QPalette::Window + setAutoFillBackground(true), отображать или нет wiget->setVisible, ну и цвет можно динамически менять если нужно, делать прозрачным чтобы только часть была закрашена и т.д., тут всё на логику приложения нужно завязывать и думать как удобней легче, 1 элемент тебе понадобится или под каждый столбец свой, если полностью красится то setBackground без отдельных элементов.
  "wgt"
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>286</width>
    <height>54</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QHBoxLayout" name="horizontalLayout">
   <item>
    <widget class="QWidget" name="wgt1" native="true">
     <property name="palette">
      <palette>
       <active>
        <colorrole role="Base">
         <brush brushstyle="SolidPattern">
          <color alpha="255">
           <red>255</red>
           <green>255</green>
           <blue>255</blue>
          </color>
         </brush>
        </colorrole>
        <colorrole role="Window">
         <brush brushstyle="SolidPattern">
          <color alpha="255">
           <red>239</red>
           <green>41</green>
           <blue>41</blue>
          </color>
         </brush>
        </colorrole>
       </active>
       <inactive>
        <colorrole role="Base">
         <brush brushstyle="SolidPattern">
          <color alpha="255">
           <red>255</red>
           <green>255</green>
           <blue>255</blue>
          </color>
         </brush>
        </colorrole>
        <colorrole role="Window">
         <brush brushstyle="SolidPattern">
          <color alpha="255">
           <red>239</red>
           <green>41</green>
           <blue>41</blue>
          </color>
         </brush>
        </colorrole>
       </inactive>
       <disabled>
        <colorrole role="Base">
         <brush brushstyle="SolidPattern">
          <color alpha="255">
           <red>239</red>
           <green>41</green>
           <blue>41</blue>
          </color>
         </brush>
        </colorrole>
        <colorrole role="Window">
         <brush brushstyle="SolidPattern">
          <color alpha="255">
           <red>239</red>
           <green>41</green>
           <blue>41</blue>
          </color>
         </brush>
        </colorrole>
       </disabled>
      </palette>
     </property>
     <property name="autoFillBackground">
      <bool>true</bool>
     </property>
    </widget>
   </item>
   <item>
    <widget class="QWidget" name="wgt2" native="true">
     <property name="palette">
      <palette>
       <active>
        <colorrole role="Base">
         <brush brushstyle="SolidPattern">
          <color alpha="255">
           <red>255</red>
           <green>255</green>
           <blue>255</blue>
          </color>
         </brush>
        </colorrole>
        <colorrole role="Window">
         <brush brushstyle="SolidPattern">
          <color alpha="255">
           <red>115</red>
           <green>210</green>
           <blue>22</blue>
          </color>
         </brush>
        </colorrole>
       </active>
       <inactive>
        <colorrole role="Base">
         <brush brushstyle="SolidPattern">
          <color alpha="255">
           <red>255</red>
           <green>255</green>
           <blue>255</blue>
          </color>
         </brush>
        </colorrole>
        <colorrole role="Window">
         <brush brushstyle="SolidPattern">
          <color alpha="255">
           <red>115</red>
           <green>210</green>
           <blue>22</blue>
          </color>
         </brush>
        </colorrole>
       </inactive>
       <disabled>
        <colorrole role="Base">
         <brush brushstyle="SolidPattern">
          <color alpha="255">
           <red>115</red>
           <green>210</green>
           <blue>22</blue>
          </color>
         </brush>
        </colorrole>
        <colorrole role="Window">
         <brush brushstyle="SolidPattern">
          <color alpha="255">
           <red>115</red>
           <green>210</green>
           <blue>22</blue>
          </color>
         </brush>
        </colorrole>
       </disabled>
      </palette>
     </property>
     <property name="autoFillBackground">
      <bool>true</bool>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>
Re[4]: Как рисовать в клетке таблицы QTableWidget?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 27.07.22 13:25
Оценка:
Здравствуйте, Igore, Вы писали:

I>Есть таблица, в ней есть строки, строки делятся на ячейки, в ячейках нужно рисовать разными цветами, причем не полностью ячейку но и например половину.

I>Так как ты выбрал QTableWidget то самый простой вариант видится использовать setCellWidget, делаешь для столбца где нужно красить часть ячейки свой виджет, который будет сделан приблизительно так:
I>------- ------
I>| wgt1 | wgt2 |
I>------- ------
I>wgt1 и wgt2 в RowLayout , цвет QPalette::Window + setAutoFillBackground(true), отображать или нет wiget->setVisible, ну и цвет можно динамически менять если нужно, делать прозрачным чтобы только часть была закрашена и т.д., тут всё на логику приложения нужно завязывать и думать как удобней легче, 1 элемент тебе понадобится или под каждый столбец свой, если полностью красится то setBackground без отдельных элементов.

Спасибо за ответ!
1613 г. = 2024 г.
Re: Как рисовать в клетке таблицы QTableWidget?
От: SaZ  
Дата: 28.07.22 15:32
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Как программно рисовать в клетке таблицы QTableWidget?


Я когда-то давно баловался с делегатами. Может пригодиться: https://stackoverflow.com/a/16301316/1035613
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.