Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Etud от Апрель 09, 2010, 15:48



Название: Удалить сетку строки QTableWidget
Отправлено: Etud от Апрель 09, 2010, 15:48
После удаления итемов 1-й  (ОДНОЙ) строки остается сетка строки.
После добавления новой строки она сдвигается.

Через clear() можно удалить все, а мне бы сетку строки (итемы знаю как удалить).

Как ее удалить ?

Подскажите пожалуйста !



Название: Re: Удалить сетку строки QTableWidget
Отправлено: lit-uriy от Апрель 09, 2010, 16:11
больше на глюк похоже, нужен тестовый код.


Название: Re: Удалить сетку строки QTableWidget
Отправлено: Павел_F. от Апрель 09, 2010, 19:51
Я чего-то не понял... А что строка должна удалится когда итемы удаляют? Я всегда думал что есть таблица, в каждой ячейке есть итем( ну или нет). Итем можно удалить из ячейки, но ячейка-то при этом и не должна удалятся. Чтоб строку удалить нужно ее и удалять, причем тут содержимое? А если строку нужно, но без делений на колонки то за этим void QTableView::setSpan ( int row, int column, int rowSpanCount, int columnSpanCount ) имеется, а уж что там будет за итем, и будет ли, опять же не важно.


Название: Re: Удалить сетку строки QTableWidget
Отправлено: garryHotDog от Апрель 10, 2010, 07:55
удаляй строку через :
Код:
void QTableWidget::removeRow ( int row )   [slot]
Removes the row row and all its items from the table.


Название: Re: Удалить сетку строки QTableWidget
Отправлено: Etud от Апрель 10, 2010, 12:26
Приведу кодик:

CWidget.h
Код:
#ifndef _CWidget_H_
#define _CWidget_H_

#include <QtGui>
#include <QWidget>



class CWidget : public QWidget
{
    Q_OBJECT

public:
    CWidget(QWidget *parent = 0);

private:
QLineEdit *line1, *line2;
QLabel *labelPapka;
QPushButton *pushButton1, *pushButton2,  *pushButton3;

QTableWidget *table;
// строка в таблице
int i,j;
int x;
QTableWidgetItem *twi1[5];
QLabel *lab2[5], *lab3[5];

public slots:
void addStr();
void delStr();
void delAll();
};

#endif // _CWidget_H_

CWidget.сpp
Код:
#include "CWidget.h"


CWidget::CWidget(QWidget *parent) :QWidget(parent)
{

i=0; j=0; // 1-я строка

resize(750,300); // размер СWidget

// таблица
table = new QTableWidget;
table->setColumnCount(3);
table->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter);
table->horizontalHeader()->setResizeMode(QHeaderView::Stretch); //автоширина колонок
table->setSelectionBehavior(QAbstractItemView::SelectRows);     // выделить 1 строку

QStringList *lst = new QStringList;
*lst << "linc" << "name" << "length";
table->setHorizontalHeaderLabels(*lst);

//гипер-ссылка
line1 = new QLineEdit("http://");
QLabel* label_Linc = new QLabel("Linc:");
label_Linc->setBuddy(line1);

//кнопки
pushButton1 = new QPushButton("AddStr");
pushButton2 = new QPushButton("DelStr");
pushButton3 = new QPushButton("DelAll");

// папка
labelPapka = new QLabel("Papka");
line2 = new QLineEdit("C:\\Papka\\");


//1 - left
QGridLayout* left_Layout = new QGridLayout;
left_Layout->addWidget(label_Linc, 0, 0);
left_Layout->addWidget(line1, 0, 1);
left_Layout->addWidget(table, 1, 0, 1, 2);
left_Layout->addWidget(labelPapka, 2, 0);
left_Layout->addWidget(line2, 2, 1);
//2 - right
QVBoxLayout* right_Layout = new QVBoxLayout;
right_Layout->addWidget(pushButton1);
right_Layout->addWidget(pushButton2);
right_Layout->addWidget(pushButton3);
//3 - main
QHBoxLayout* main_Layout= new QHBoxLayout;
main_Layout->addLayout(left_Layout);
main_Layout->addLayout(right_Layout);
setLayout(main_Layout);


// добавить строку
connect(pushButton1, SIGNAL(clicked() ), SLOT( addStr() ));
// удалить строку
connect(pushButton2, SIGNAL(clicked() ), SLOT( delStr() ));
// удалить все строки
connect(pushButton3, SIGNAL(clicked() ), SLOT( delAll() ));

}


void CWidget::addStr()
{
// вставить строку
table->insertRow(i);

twi1[i] = new QTableWidgetItem(QString("http://"));  //1
table->setItem(i, j, twi1[i]);

lab2[i] = new QLabel("10");
table->setCellWidget(i, j+1, lab2[i]);      //2

lab3[i] = new QLabel("20");
table->setCellWidget(i, j+2, lab3[i]);      //3

// 0 0  |  0 1
// 1 0  |  1 1
i++; j=0;         // еще строка
}


void CWidget::delStr()
{

int x = table->currentIndex().row();

// удалить строку
table->removeRow(x);

if (x > 0) i= i-1;
else i = 0;
}


void CWidget::delAll()
{

table->clearContents();
table->clear();

QStringList *lst = new QStringList;
*lst << "linc" << "name" << "length";
table->setHorizontalHeaderLabels(*lst);

i = 0;
}

garryHotDog - спасибо строка удалена.

Надо еще сетку убрать после удаления всех строк.



Название: Re: Удалить сетку строки QTableWidget
Отправлено: shirushizo от Апрель 10, 2010, 15:52
Сетка остается на месте удаленной строки?


Название: Re: Удалить сетку строки QTableWidget
Отправлено: Etud от Апрель 10, 2010, 18:05
Цитировать
Сетка остается на месте удаленной строки ?

Нет. С одной строкой все хорошо - удаляется.


Название: Re: Удалить сетку строки QTableWidget
Отправлено: Павел_F. от Апрель 10, 2010, 22:26
Когда удаляете одну строку то используете removeRow и она действительно удаляет строку.
Когда хотите удалить все используете
Цитировать
void QTableWidget::clearContents ()   [slot]
Removes all items not in the headers from the view. This will also remove all selections. The table dimensions stay the same.
Удаляет содержимое строк, оставляет заголовки. размерность таблицы не меняется( строки НЕ удаляет)
и
Цитировать
void QTableWidget::clear ()   [slot]
Removes all items in the view. This will also remove all selections. The table dimensions stay the same.
Удаляет содержимое строки и заголовков, размерность таблицы остается прежней( строки НЕ удаляет, только чистит)

Если хотите удалить строки, то УДАЛИТЕ их( например setRowCount( 0)). И внимательно читайте справку и ответы в теме.

В вашем коде в CWidget::delAll() чистится содержимое таблицы, затем чистится содержимое и заголовки а потом вновь заполняются заголовки. И нет там удаления строки. А если хотите удалить все строки напишите так, например:
Код
C++ (Qt)
void CWidget::delAll()
{
 
table->clearContents();
table->setRowCount( 0);
 
i = 0; /*Зачеи вам i не знаю, судя по коду вы храните кол-во строк. Хотя его можно получить через rowCount()*/
}


Название: Re: Удалить сетку строки QTableWidget
Отправлено: Etud от Апрель 11, 2010, 15:04
Спасибо Павел_F

Вот еще так можно:
   
Код
C++ (Qt)
int x = 0;
for (x = table->rowCount()-1; x >= 0; x--)
table->removeRow(x);