Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Asechka от Декабрь 21, 2014, 18:18



Название: QTableWidget. Таблицы.
Отправлено: Asechka от Декабрь 21, 2014, 18:18
Как правильно написать код, чтобы таблица работала с переменными введенными с клавиатуры?


Название: Re: QTableWidget. Таблицы.
Отправлено: gil9red от Декабрь 21, 2014, 19:02
А что вы хотите от таблицы QTableWidget?


Название: Re: QTableWidget. Таблицы.
Отправлено: Asechka от Декабрь 21, 2014, 19:05
Желательно чтобы она работала с данными которые я ввожу. Примерно хочу сделать excel таблицу.


Название: Re: QTableWidget. Таблицы.
Отправлено: kambala от Декабрь 21, 2014, 19:38
если я правильно понял твою цель, в книжке Бланшетт, Саммерфилд есть отличный пример


Название: Re: QTableWidget. Таблицы.
Отправлено: Asechka от Декабрь 21, 2014, 19:46
Там через класс делается,а я хочу сделать все в конструкторе.


Название: Re: QTableWidget. Таблицы.
Отправлено: kambala от Декабрь 21, 2014, 19:52
а конструктор не в классе что ли находится? :)

опиши детальнее что ты хочешь.


Название: Re: QTableWidget. Таблицы.
Отправлено: Asechka от Декабрь 21, 2014, 20:02
Ну вот допустим у меня есть первый столбец в таблице, который я полностью заполняю(ввод с клавиатуры), в следующих столбцах уже формулы, которые я изначально определила.
Мне надо, чтобы данные из первого столбца каким-то образом записались в таблицу и без проблем считались по формулам. Пока у меня так не получается.


Название: Re: QTableWidget. Таблицы.
Отправлено: gil9red от Декабрь 21, 2014, 20:06
Можно, например, отслеживать какой элемент таблицы был изменен с помощью сигнала itemChanged (http://qt-project.org/doc/qt-4.8/qtablewidget.html#itemChanged)
или какая ячейка изменилась (будут получены ее индексы)

Посмотрите какие есть сигналы и выберите с какими будете работать: http://qt-project.org/doc/qt-4.8/qtablewidget.html#signals


Название: Re: QTableWidget. Таблицы.
Отправлено: kambala от Декабрь 21, 2014, 20:07
QTableWidget ничего не знает ни о каких формулах, это просто отображение данных. Весь функционал (парсинг формул, чтение значений через ссылки на ячейки, и т.д.) тебе придется писать самой.


Название: Re: QTableWidget. Таблицы.
Отправлено: Asechka от Декабрь 21, 2014, 20:08
Можно, например, отслеживать какой элемент таблицы был изменен с помощью сигнала itemChanged (http://qt-project.org/doc/qt-4.8/qtablewidget.html#itemChanged)
Можно пожалуйста подробнее?


Название: Re: QTableWidget. Таблицы.
Отправлено: Asechka от Декабрь 21, 2014, 20:12
Посмотрите какие есть сигналы и выберите с какими будете работать: http://qt-project.org/doc/qt-4.8/qtablewidget.html#signals

Я знаю какие есть сигналы. Просто не понимаю, как с ними работать.
Мне бы конкретный пример работы, когда данные вводятся с клавиатуры.


Название: Re: QTableWidget. Таблицы.
Отправлено: gil9red от Декабрь 21, 2014, 20:13
Можно, например, отслеживать какой элемент таблицы был изменен с помощью сигнала itemChanged (http://qt-project.org/doc/qt-4.8/qtablewidget.html#itemChanged)
Можно пожалуйста подробнее?

Пожалуйста:
Код
C++ (Qt)
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
 
   QObject::connect(ui->tableWidget, SIGNAL(itemChanged(QTableWidgetItem*)), SLOT(changed(QTableWidgetItem*)));
   QObject::connect(ui->tableWidget, SIGNAL(cellChanged(int,int)), SLOT(changed(int,int)));
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
void MainWindow::changed(QTableWidgetItem *item) {
   qDebug() << QString("Элемент [%1, %2] %3 был изменен.").arg(item->row()).arg(item->column()).arg(item->text());
}
void MainWindow::changed(int row, int column) {
   qDebug() << QString("Ячейка [%1, %2] была изменена.").arg(row).arg(column);
}
 


Название: Re: QTableWidget. Таблицы.
Отправлено: Alexu007 от Декабрь 21, 2014, 20:19
Код
C++ (Qt)
           QTableWidgetItem *item = new QTableWidgetItem();
           item->setText(str);
           ui->tableWidget->setItem(1, 2, item);

Вот так можно записать строку (str) в произвольное место таблицы, в данном случае строка 1 колонка 2 (начинаются с 0).


Название: Re: QTableWidget. Таблицы.
Отправлено: Asechka от Декабрь 21, 2014, 20:34
Код
C++ (Qt)
           QTableWidgetItem *item = new QTableWidgetItem();
           item->setText(str);
           ui->tableWidget->setItem(1, 2, item);

Вот так можно записать строку (str) в произвольное место таблицы, в данном случае строка 1 колонка 2 (начинаются с 0).

Да это я знаю как сделать ;)


Название: Re: QTableWidget. Таблицы.
Отправлено: Asechka от Декабрь 21, 2014, 20:36
Цитировать
Пожалуйста:
Код
C++ (Qt)
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
 
   QObject::connect(ui->tableWidget, SIGNAL(itemChanged(QTableWidgetItem*)), SLOT(changed(QTableWidgetItem*)));
   QObject::connect(ui->tableWidget, SIGNAL(cellChanged(int,int)), SLOT(changed(int,int)));
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
void MainWindow::changed(QTableWidgetItem *item) {
   qDebug() << QString("Элемент [%1, %2] %3 был изменен.").arg(item->row()).arg(item->column()).arg(item->text());
}
void MainWindow::changed(int row, int column) {
   qDebug() << QString("Ячейка [%1, %2] была изменена.").arg(row).arg(column);
}
 

Спасибо. Более-менее глаза мне открыли.


Название: Re: QTableWidget. Таблицы.
Отправлено: Asechka от Декабрь 21, 2014, 20:43
Пожалуйста:
Код
C++ (Qt)
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
 
   QObject::connect(ui->tableWidget, SIGNAL(itemChanged(QTableWidgetItem*)), SLOT(changed(QTableWidgetItem*)));
   QObject::connect(ui->tableWidget, SIGNAL(cellChanged(int,int)), SLOT(changed(int,int)));
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
void MainWindow::changed(QTableWidgetItem *item) {
   qDebug() << QString("Элемент [%1, %2] %3 был изменен.").arg(item->row()).arg(item->column()).arg(item->text());
}
void MainWindow::changed(int row, int column) {
   qDebug() << QString("Ячейка [%1, %2] была изменена.").arg(row).arg(column);
}
 

А вот могу я вместо вывода надписи в changed присвоить какой-нибудь l значения ячейки, которую изменили?


Название: Re: QTableWidget. Таблицы.
Отправлено: gil9red от Декабрь 21, 2014, 20:49
Пожалуйста:
Код
C++ (Qt)
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
 
   QObject::connect(ui->tableWidget, SIGNAL(itemChanged(QTableWidgetItem*)), SLOT(changed(QTableWidgetItem*)));
   QObject::connect(ui->tableWidget, SIGNAL(cellChanged(int,int)), SLOT(changed(int,int)));
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
void MainWindow::changed(QTableWidgetItem *item) {
   qDebug() << QString("Элемент [%1, %2] %3 был изменен.").arg(item->row()).arg(item->column()).arg(item->text());
}
void MainWindow::changed(int row, int column) {
   qDebug() << QString("Ячейка [%1, %2] была изменена.").arg(row).arg(column);
}
 

А вот могу я вместо вывода надписи в changed присвоить какой-нибудь l значения ячейки, которую изменили?

Можете :) Разрешаю ;D

Код:
void MainWindow::changed(QTableWidgetItem *item) {
    item->setText("!!!");
}


Название: Re: QTableWidget. Таблицы.
Отправлено: Asechka от Декабрь 21, 2014, 20:51
Можете :) Разрешаю ;D

как то так?
Код:
void MainWindow::changed() 
{
    QTableWidgetItem *item;
    l=item->text();
}


Название: Re: QTableWidget. Таблицы.
Отправлено: gil9red от Декабрь 21, 2014, 20:53
Можете :) Разрешаю ;D

как то так?
Код:
void MainWindow::changed() 
{
    QTableWidgetItem *item;
    l=item->text();
}

нет :)

Код:
void MainWindow::changed(QTableWidgetItem *item) {
    QString text_cell = item->text();
    ...
}

я не знаю какого типа ваша переменная l :)

Если она типа int, тогда:
Код:
void MainWindow::changed(QTableWidgetItem *item) {
    QString text_cell = item->text();
    int l = text_cell.toInt();
    ...
}


Название: Re: QTableWidget. Таблицы.
Отправлено: Asechka от Декабрь 21, 2014, 20:56
Она типа QString.

Допустим. Спасибо :)


Название: Re: QTableWidget. Таблицы.
Отправлено: gil9red от Декабрь 21, 2014, 20:58
Она типа QString.

Допустим. Спасибо :)

Пожалуйста :) Обращайтесь ;)


Название: Re: QTableWidget. Таблицы.
Отправлено: Asechka от Декабрь 21, 2014, 21:00
Я ее хочу потом преобразовать в float.


Название: Re: QTableWidget. Таблицы.
Отправлено: gil9red от Декабрь 21, 2014, 21:41
Я ее хочу потом преобразовать в float.

http://qt-project.org/doc/qt-4.8/qstring.html#toFloat


Название: Re: QTableWidget. Таблицы.
Отправлено: Asechka от Декабрь 21, 2014, 22:31
http://qt-project.org/doc/qt-4.8/qstring.html#toFloat
Ну это я знаю. Спасибо :)

Что-то не нравится ему этот код... Ошибки выдает.


Название: Re: QTableWidget. Таблицы.
Отправлено: gil9red от Декабрь 22, 2014, 00:55
http://qt-project.org/doc/qt-4.8/qstring.html#toFloat
Ну это я знаю. Спасибо :)

Что-то не нравится ему этот код... Ошибки выдает.

Сложно понять в чем ошибка, не зная ее и не видя код


Название: Re: QTableWidget. Таблицы.
Отправлено: Asechka от Декабрь 22, 2014, 03:15
Сложно понять в чем ошибка, не зная ее и не видя код
Код:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->tableWidget->setFrameStyle(3);
    ui->tableWidget->setColumnCount(3);
    ui->tableWidget->setRowCount(3);
    ui->tableWidget->setHorizontalHeaderLabels(QStringList()<< "l,см" << "Т,c" << "v,Гц" );

    QObject::connect(ui->tableWidget, SIGNAL(itemChanged(QTableWidgetItem*)), SLOT(changed(QTableWidgetItem*)));
    QObject::connect(ui->tableWidget, SIGNAL(cellChanged(int,int)), SLOT(changed(QTableWidgetItem *item)));

    for(int row = 0; row < ui->tableWidget->rowCount(); row++)
        for(int column = 1; column < 2; column++)
        {
            T=2*pi*sqrt(d/g);
            QTableWidgetItem *item = new QTableWidgetItem();
            item->setText(QString("%1").arg(T));
            ui->tableWidget->setItem(row, column, item);
        }
}

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

void MainWindow::changed(QTableWidgetItem *item)
{
    QString text_cell = item->text();
    d = text_cell.toInt();
    
}

C2511: void MainWindow::changed(QTableWidgetItem *): ЇҐаҐЈа㦥­­ п дг­ЄжЁп-з«Ґ­ ­Ґ ­ ©¤Ґ­  ў "MainWindow"
C2597: ­Ґ¤®ЇгбвЁ¬ п ббл«Є  ­  ­Ґбв вЁзҐбЄЁ© з«Ґ­ "MainWindow::d"


Название: Re: QTableWidget. Таблицы.
Отправлено: kambala от Декабрь 22, 2014, 03:32
переменная d ему чем-то не угодила, без заголовочного файла точнее сказать нельзя


Название: Re: QTableWidget. Таблицы.
Отправлено: Asechka от Декабрь 22, 2014, 03:34
переменная d ему чем-то не угодила, без заголовочного файла точнее сказать нельзя
Код:
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();


private slots:

    //void on_pushButton_clicked();
    void changed(QTableWidgetItem*);

private:
    float T,g,pi;
    int d;
    QString l,l1;
    Ui::MainWindow *ui;
};


Название: Re: QTableWidget. Таблицы.
Отправлено: Alexu007 от Декабрь 22, 2014, 08:56
Чему равны d и g в конструкторе формы?

Если ты хочешь по кликам на ячейки таблицы и введённым туда значениям заполнять другие ячейки - то это не в конструкторе формы же делать нада, а в обработчике сигналов изменения ячейки. Куда должны передаваться row и col ячейки. Конструктор формы работает только в момент создания формы, а не тогда, когда приложение уже запущено и ты в таблицу кликаешь.

Ну эт не считая того, что ты int делишь на float - какой результат ожидается?


Название: Re: QTableWidget. Таблицы.
Отправлено: Fregloin от Декабрь 22, 2014, 14:48
Читаем внимательно про модели и представления QAbstractItemModel/QItemDelegate/QTableView. И не надо писать какие то глупости.
QTableWidget служит для вывода небольшого объема простых данных.