Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ QTableWidget

Автор: canavar 28.3.2009, 0:16

Доброго всем вечера.

Есть два вопросик по QTableWidget:

1. Существует три колонки. Реально ли зафиксировать боковые колонки (чтобы не менялась их ширина), а ширину средней колонки сделать плавающей (если окно растягиваем, то растягивается только средняя колонка). Реально ли это сделать?

2. Можно ли сразу поменять цвет строки или же необходимо менять цвет каждого Item'а, находящегося в строке?

Заранее спасибо.

Автор: igor_bogomolov 28.3.2009, 0:47

1. Конечно реально.

Цитата
void resizeSection ( int logicalIndex, int size );
void setResizeMode ( int logicalIndex, ResizeMode mode )

// задаем ширину столбцов
tableWidget->horizontalHeader()->resizeSection(0, 100);
tableWidget->horizontalHeader()->resizeSection(2, 100);
// фиксируем их размер
tableWidget->horizontalHeader()->setResizeMode(0, QHeaderView::Fixed);
tableWidget->horizontalHeader()->setResizeMode(2, QHeaderView::Fixed);
// центральный столбей делаем "растягивающимся"
tableWidget->horizontalHeader()->setResizeMode(1, QHeaderView::Stretch);


2. Функции, чтобы поменять цвет нужной строки нет (по крайней мере я такой не знаю).
Можно сделать через делегат, переопредилив метод paint(). Либо, как и предпологали, менять цвет в каждом итеме.

Автор: Litkevich Yuriy 28.3.2009, 3:13

canavar, по превому вопросу следовало воспользоваться поиском, и темой FAQ

Автор: canavar 28.3.2009, 14:18

Абсолютно согласен, что нужно было маны почитать, просто я уже не соображал, а сделать было нужно.

Спасибо за консультацию.

Автор: hmmm 29.3.2009, 0:36

Скажите а кто-нить сталкивался с такой проблемой... имеется QTreeWidget
Меняю у одной строки через sizeHint размер на высоту например 200. А сам widget имеет высоту 100. При этом прокрутка не появляется, при том что выбрана ScrollBarAlwaysOn или ScrollBarAsNeeded. Кто-нибудь знает как решить это??? Как сделать так чтобы прокрутка корректно отрабатывала в таких случаях??

p/s показалось что вопрос подходит к теме..

Автор: igor_bogomolov 29.3.2009, 2:25

Цитата(Гость_hmmm_* @ 29.3.2009, 0:36) *
имеется QTreeWidget
Меняю у одной строки через sizeHint размер

Предполагаю, что это просто опечатка. Скорее всего имелось в виду
void QTreeWidgetItem::setSizeHint ( int column, const QSize & size )


Никаких проблем по идее возникнуть не должно. После изменения высоты следующим образом
    QTreeWidgetItem *item = treeWidget->topLevelItem(0);
    item->setSizeHint(0, QSize(50, 550));

автоматически появляется полоса прокрутки.
Проверяйте свой код.

Автор: hmmmm 30.3.2009, 0:57

Делал похожим образом, дабы далее не растекаться мыслью по древу приведу то что я пробую сделать.. Много всего урезал для того чтобы было кратко и понятно..

tree_widget_experiment.cpp:

#include "tree_widget_experiment.h"
#include <QTreeWidgetItem>
#include <QtGui>

tree_widget_experiment::tree_widget_experiment(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    QWidget *centralWidget;
    QHBoxLayout *horizontalLayout;
    QTreeWidget *treeWidget;
        
    QFrame *frame;
    QGridLayout *gridLayout;
    QLabel *label_19;
    QLabel *label_21;
    QLabel *label_20;
    QSpacerItem *horizontalSpacer;
    QLabel *label_22;
    QPlainTextEdit *plainTextEdit_4;
    
    centralWidget = new QWidget(this);
    horizontalLayout = new QHBoxLayout(centralWidget);
    treeWidget = new QTreeWidget(centralWidget);
    horizontalLayout->addWidget(treeWidget);
    
    this->resize(800, 157);
    this->setCentralWidget(centralWidget);
    
    frame = new QFrame();
    frame->setMaximumSize(QSize(16777215, 150));
    frame->setFrameShape(QFrame::NoFrame);
    frame->setFrameShadow(QFrame::Raised);
    frame->setLineWidth(0);
    
    label_19 = new QLabel(frame);
    label_21 = new QLabel(frame);
    label_20 = new QLabel(frame);
    horizontalSpacer = new QSpacerItem(198, 17, QSizePolicy::Expanding, QSizePolicy::Minimum);
    label_22 = new QLabel(frame);
    plainTextEdit_4 = new QPlainTextEdit(frame);
    
    label_19->setText("awefawef");
    label_21->setText("awefawef");
    label_20->setText("awefawef");
    label_22->setText("awefawef");

    gridLayout = new QGridLayout(frame);
    gridLayout->setSpacing(6);
    gridLayout->setMargin(11);
    gridLayout->addWidget(label_19, 0, 0, 1, 2);
    gridLayout->addWidget(label_21, 0, 2, 1, 1);
    gridLayout->addWidget(label_20, 1, 0, 1, 1);
    gridLayout->addItem(horizontalSpacer, 1, 1, 1, 1);
    gridLayout->addWidget(label_22, 1, 2, 1, 1);
    gridLayout->addWidget(plainTextEdit_4, 2, 0, 1, 3);

    QTreeWidgetItem *parentWI = new QTreeWidgetItem(treeWidget);
    parentWI->setText(0, "S/n: HWKHBKW923423");
    
    QTreeWidgetItem *childWI = new QTreeWidgetItem(parentWI);
    childWI->setSizeHint(0,QSize(50,400));
    treeWidget->setItemWidget(childWI,0,frame);
    
}

tree_widget_experiment::~tree_widget_experiment()
{

}


tree_widget_experiment.h :
#ifndef TREE_WIDGET_EXPERIMENT_H
#define TREE_WIDGET_EXPERIMENT_H

#include <QtGui/QMainWindow>

class tree_widget_experiment : public QMainWindow
{
    Q_OBJECT

public:
    tree_widget_experiment(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~tree_widget_experiment();


};

#endif // TREE_WIDGET_EXPERIMENT_H


main.cpp
#include <QtGui/QApplication>
#include "tree_widget_experiment.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    tree_widget_experiment w;
    w.show();
    return a.exec();
}


Если попытаетесь посмотреть как оно работает заметите две особенности:
1) когда раскрыли список и не меняли размер окна идёт рваная прокрутка...
2) когда не меняем размер окна и раскрываем список не вся часть ячейки видна хотя запас 400 должно хватать с головой...и прокрутка не даёт увидеть всю ячейку...

вообщем ничего не выходит((((

Автор: igor_bogomolov 30.3.2009, 10:27

Эх, заставили вы меня помучиться. А решение как всегда оказалось проще некуда :rolleyes:
Нужно всего лишь добавить свойство

treeWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);

:dance2:

Автор: hmmmm 30.3.2009, 22:05

Огромное спасибо!!!!

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)