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

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

Форум на CrossPlatform.RU _ Qt GUI _ автозаполнение в QTableWidget

Автор: mettamo 22.10.2009, 20:48

Здрасте!

Есть пустая таблица QTableWidget

необходимо что бы по вводу значения допустим в ячейке [1,3], это же значение помещалось в ячейку [3,1]

пробовал сделать так

void MainWindow::on_TabG_cellChanged(int row,int column)
{
   ui->TabG->item(column,row)->setText(ui->TabG->item(row,column)->text());
}


но так не получается.

помогите разобраться(((

Автор: Litkevich Yuriy 22.10.2009, 22:45

Цитата(mettamo @ 23.10.2009, 0:48) *
но так не получается.
а что получается?

Автор: mettamo 22.10.2009, 23:14

Цитата(Litkevich Yuriy @ 22.10.2009, 23:45) *
Цитата(mettamo @ 23.10.2009, 0:48) *
но так не получается.
а что получается?

прога слетает, вообщем нечего нечего не получается

Автор: BRE 23.10.2009, 8:14

Цитата(mettamo @ 23.10.2009, 0:14) *
прога слетает, вообщем нечего нечего не получается

Так и должно быть. ;)
Если таблица пустая, то конструкция ui->TabG->item(column,row) будет возвращать 0.

Автор: mettamo 23.10.2009, 14:05

Цитата(BRE @ 23.10.2009, 9:14) *
Цитата(mettamo @ 23.10.2009, 0:14) *
прога слетает, вообщем нечего нечего не получается

Так и должно быть. ;)
Если таблица пустая, то конструкция ui->TabG->item(column,row) будет возвращать 0.


А как ее заполнить?

Автор: zamnach 23.10.2009, 14:21

в условиях вашей задачи не описано требуемое поведение проги для случая (column==row)
+ таблица может быть неквадратной, тоже нужны проверки

Автор: mettamo 23.10.2009, 14:31

Цитата(zamnach @ 23.10.2009, 15:21) *
в условиях вашей задачи не описано требуемое поведение проги для случая (column==row)
+ таблица может быть неквадратной, тоже нужны проверки


таблица квадратная

Автор: mettamo 23.10.2009, 17:02

Думал это простой вопрос, а никто ответить не может.

Автор: BRE 23.10.2009, 17:07

Цитата(mettamo @ 23.10.2009, 18:02) *
Думал это простой вопрос, а никто ответить не может.

Для того, что бы получить item из QTableWidget, вначале нужно его установить QTableWidget::setItem.
Если элемент не установлен, то метод QTableWidget::item будет возвращать 0.

Теперь посмотри на свой код:
ui->TabG->item(column,row)->setText(ui->TabG->item(row,column)->text());


Автор: mettamo 23.10.2009, 17:27

void MainWindow::on_TableGraf_cellChanged(int row, int column)
{
    ui->TableGraf->item(row,column)->setBackgroundColor(Qt::green);
    QTableWidgetItem *newItem = new QTableWidgetItem(QTableWidgetItem::UserType);
    ui->TableGraf->setItem(column,row, newItem);
    ui->TableGraf->item(column,row)->setText(ui->TableGraf->item(row,column)->text());


}


вот устанавливается Item но все равно не работает

Автор: BRE 23.10.2009, 17:29

Цитата(mettamo @ 23.10.2009, 18:27) *
вот устанавливается Item но все равно не работает

Не работает как: программа падает?

Автор: mettamo 23.10.2009, 17:32

просто сразу же закрывается, не знаб как описать по другому

может подключить надо что-то?

Автор: BRE 23.10.2009, 17:38

Цитата(mettamo @ 23.10.2009, 18:32) *
может подключить надо что-то?

Точно, внимательность. ;)

void MainWindow::on_TableGraf_cellChanged(int row, int column)
{

ui->TableGraf->item(row,column)->setBackgroundColor(Qt::green);    // !!! Вот здесь элемента еще нет и item вернет 0.
                                                        // !!! Соответственно ты по нулевому указателю метод вызываешь.

QTableWidgetItem *newItem = new QTableWidgetItem(QTableWidgetItem::UserType);
ui->TableGraf->setItem(column,row, newItem);
ui->TableGraf->item(column,row)->setText(ui->TableGraf->item(row,column)->text());


}

Автор: mettamo 23.10.2009, 17:41

Командир не в этом дело, все ровно не пашет, запусти пожалуйста у себя Qt попробуй просто очень надо, весь инет перерыл - нет ответа.

Автор: BRE 23.10.2009, 17:54

Цитата(mettamo @ 23.10.2009, 18:41) *
Командир не в этом дело, все ровно не пашет, запусти пожалуйста у себя Qt попробуй просто очень надо, весь инет перерыл - нет ответа.

Покажи больше кода. Создание/заполнение QTableWidget и использование.

Автор: mettamo 23.10.2009, 18:02

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QColor>
#include <QTableWidgetItem>
#include "math.h"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindowClass)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()//сам QTableWidget я в QtCreatorе на форму кидаю
{
ui->TableGraf->setColumnCount(ui->lineEdit->text().toInt());
ui->TableGraf->setRowCount(ui->lineEdit->text().toInt());
for (int i=0;i<=ui->lineEdit->text().toInt();i++)
    {
        ui->TableGraf->setColumnWidth(i,25);
        ui->TableGraf->setRowHeight(i,25);

    }
ui->TableGraf->horizontalHeader()->setResizeMode(QHeaderView::Fixed);
}


void MainWindow::on_TableGraf_cellChanged(int row, int column)
{
    //ui->TableGraf->item(row,column)->setBackgroundColor(Qt::green);
    QTableWidgetItem *nwItem = new QTableWidgetItem(QTableWidgetItem::UserType);
    ui->TableGraf->setItem(column,row, nwItem);
    ui->TableGraf->item(column,row)->setText("h");
    //ui->TableGraf->item(column,row,new QTableWidgetItem(tr("[none]")));

}

Автор: BRE 23.10.2009, 18:27

Цитата(mettamo @ 23.10.2009, 19:02) *
void MainWindow::on_pushButton_clicked()//сам QTableWidget я в QtCreatorе на форму кидаю
{
ui->TableGraf->setColumnCount(ui->lineEdit->text().toInt());
ui->TableGraf->setRowCount(ui->lineEdit->text().toInt());

// Почему <=, должно быть <
for (int i=0;i <= ui->lineEdit->text().toInt();i++)
{
ui->TableGraf->setColumnWidth(i,25);
ui->TableGraf->setRowHeight(i,25);

}
ui->TableGraf->horizontalHeader()->setResizeMode(QHeaderView::Fixed);
}


Так когда программа падает? Когда кнопку нажимаешь или когда значение меняешь?

Автор: mettamo 23.10.2009, 18:38

когда значение меняешь.

Автор: BRE 23.10.2009, 19:14

Все ясно. Возникает рекурсия, поэтому нужно блокировать сигналы на время установки элемента.

Раскрывающийся текст

#include <QApplication>                                                                                                   
#include <QWidget>                                                                                                        
#include <QTableWidget>                                                                                                  
#include <QLayout>                                                                                                        
#include <QDebug>                                                                                                        

class Widget : public QWidget
{                            
        Q_OBJECT            
public:                      
        Widget() : QWidget( 0 )
        {                      
                QVBoxLayout *layout = new QVBoxLayout( this );
                m_table = new QTableWidget( this );
                m_table->setRowCount( 5 );
                m_table->setColumnCount( 5 );
                connect( m_table, SIGNAL( cellChanged( int, int ) ), SLOT( cellChanged( int, int ) ) );

                layout->addWidget( m_table );

                setLayout( layout );
        }

public slots:
        void    cellChanged( int row, int column )
        {
                qDebug() << "Changed item" << row << column << m_table->item( row, column );
                QTableWidgetItem *item = new QTableWidgetItem;
                item->setText( "Test" );
                m_table->blockSignals( true );
                m_table->setItem( column, row, item );
                m_table->blockSignals( false );
        }

protected:
        QTableWidget    *m_table;
};

int main( int argc, char *argv[] )
{
        QApplication app( argc, argv );

        Widget w;
        w.show();

        return app.exec();
}

#include "main.moc"


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