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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Удалить сетку строки QTableWidget  (Прочитано 13225 раз)
Etud
Гость
« : Апрель 09, 2010, 15:48 »

После удаления итемов 1-й  (ОДНОЙ) строки остается сетка строки.
После добавления новой строки она сдвигается.

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

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

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

Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Апрель 09, 2010, 16:11 »

больше на глюк похоже, нужен тестовый код.
Записан

Юра.
Павел_F.
Гость
« Ответ #2 : Апрель 09, 2010, 19:51 »

Я чего-то не понял... А что строка должна удалится когда итемы удаляют? Я всегда думал что есть таблица, в каждой ячейке есть итем( ну или нет). Итем можно удалить из ячейки, но ячейка-то при этом и не должна удалятся. Чтоб строку удалить нужно ее и удалять, причем тут содержимое? А если строку нужно, но без делений на колонки то за этим void QTableView::setSpan ( int row, int column, int rowSpanCount, int columnSpanCount ) имеется, а уж что там будет за итем, и будет ли, опять же не важно.
« Последнее редактирование: Апрель 09, 2010, 20:00 от Павел_F. » Записан
garryHotDog
Гость
« Ответ #3 : Апрель 10, 2010, 07:55 »

удаляй строку через :
Код:
void QTableWidget::removeRow ( int row )   [slot]
Removes the row row and all its items from the table.
Записан
Etud
Гость
« Ответ #4 : Апрель 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 - спасибо строка удалена.

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

Записан
shirushizo
Гость
« Ответ #5 : Апрель 10, 2010, 15:52 »

Сетка остается на месте удаленной строки?
Записан
Etud
Гость
« Ответ #6 : Апрель 10, 2010, 18:05 »

Цитировать
Сетка остается на месте удаленной строки ?

Нет. С одной строкой все хорошо - удаляется.
Записан
Павел_F.
Гость
« Ответ #7 : Апрель 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()*/
}
« Последнее редактирование: Апрель 10, 2010, 22:39 от Павел_F. » Записан
Etud
Гость
« Ответ #8 : Апрель 11, 2010, 15:04 »

Спасибо Павел_F

Вот еще так можно:
   
Код
C++ (Qt)
int x = 0;
for (x = table->rowCount()-1; x >= 0; x--)
table->removeRow(x);
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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