[SOLVED] Insert row from Qtableview to another
-
Then change 1 by tableNouveau->rowCount()
-
Wow, this works
Now, what i want exactly is
the user isn't able to add row until he fills all cells
then he clicks "Key_Down" to add new row ( so her i will catch Qkeypressevent)
Plz give somme hints, so i will try to implement this my selef and render the code for you to correct me
thank's a lot SGaist
-
i have tried to inherif from Qtablewidget and override keypressevent function
i have declared keypressevent function as signal
it works with this condition
@if ( event->key() == Qt::key_Down)@but when i add more conditions the app crached
her is my code
customtablewidget class @class MonTableauWidget : public QTableWidget
{
Q_OBJECT
public:
explicit MonTableauWidget(QWidget *parent = 0);signals:
void keyPressEvent(QKeyEvent *event);
public slots:};
@the main of classe @#include "montableauwidget.h"
MonTableauWidget::MonTableauWidget(QWidget *parent) :
QTableWidget(parent)
{}
@
and her is my main where i tried to connect siganl with slot @#include "dialog.h"
Dialog::Dialog(QWidget *parent)
: QWidget(parent)
{
layoutPrincipale = new QVBoxLayout(this);
QPushButton *button = new QPushButton("Clear",this);
tableau = new MonTableauWidget(this);
tableau->setRowCount(1);
tableau->setColumnCount(4) ;
QKeyEvent event(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);QStringList list ; list << "Désignation" << "Qte" << "Prix/U" << "Total"; tableau->setHorizontalHeaderLabels(list); layoutPrincipale->addWidget(tableau); layoutPrincipale->addWidget(button); setLayout(layoutPrincipale); connect(tableau,SIGNAL(cellChanged(int,int)),this,SLOT(addrow(int,int))) ; connect(tableau,SIGNAL(keyPressEvent(QKeyEvent*)),this,SLOT(newRecod(QKeyEvent*))); connect(button,SIGNAL(clicked()),tableau,SLOT(clear()));
}
Dialog::~Dialog()
{}
void Dialog::addrow(int row, int col)
{
if(col == 0)
tableau->insertRow(tableau->rowCount());
}
// her is the problem
void Dialog::newRecod(QKeyEvent *record)
{
QModelIndex index = tableau->currentIndex();
int row = index.column();
if(record->key() == Qt::Key_Down)
if(tableau->item(row,0)->text().isEmpty())
QMessageBox::information(this,"Empty Designation","Please Fill in the cell");
else
tableau->insertRow(tableau->rowCount());
}@
-
keyPressEvent is not a signal, I would advise you to read its "documentation":http://qt-project.org/doc/qt-4.8/qabstractitemview.html#keyPressEvent
From your previous posts, and just to be sure, do you expect me to validate your work ?
-
bq. From your previous posts, and just to be sure, do you expect me to validate your work ?
sorry about that, i'm completely newbie , i have blocked to get a solution for my probelem to complete my first application
-
if i can't use keypressevent() as a signal
how i can handle this event " when the uesr click Key_Down new row added in the bottom "
-
It is explained in the function documentation
-
i still can't know what i do ,
subclass Qtablewidget and implement keypressevent
or use shortcuts . -
You can also use an event filter to catch that event, this really is up to you to choose the solution that meets your need
-
i have implemented keypressEvent function
and it works perfectly, but when i start to somme conditions the programme crashes
her is my code @void MonTableauWidget::keyPressEvent(QKeyEvent *event)
{
int LastRow = this->rowCount();switch (event->key()) { case Qt::Key_Down : // the problem occured when i added the line below if(!this->item(LastRow,0)->text().isEmpty()) this->insertRow(this->rowCount()); break; case Qt::Key_Up : this->removeRow(1); break; case Qt::Key_0 : QMessageBox::information(this,"Row coutn",QString::number( LastRow)) ; break; default: QTableWidget::keyPressEvent(event); break; }
}
@ -
@removeRow(1); << What would happen if you don't have a row number 1 ?@
-
i have used the debugger to determine what's the issue
and i think the issue is located her
because when i delete this line every thing works perfectly
@this->item(LastRow,0)->text().isEmpty() ;@this not refering to the customQtableWidget it's reffering to the
QtableWidgetItem objet -
[quote author="SGaist" date="1374875944"]@removeRow(1); << What would happen if you don't have a row number 1 ?@[/quote]
nothing is happened , means no row have to removed , but i have correct this issue
@this->removeRow(this->rowCount()-1); @
and this should works , and finally it worksthank's for the hint
-
her is my finall code @void MonTableauWidget::keyPressEvent(QKeyEvent *event)
{
int LastRow = this->rowCount()-1;// bool ok = this->item(LastRow,0)->text().isEmpty() ;
switch (event->key()) { case Qt::Key_Down : if(LastRow) this->insertRow(this->rowCount()); break; case Qt::Key_Up : this->removeRow(LastRow); break; default: QTableWidget::keyPressEvent(event); break; }
@
-
i lost hope to get the solution from my self,
the only problem now is how to test if Cell is Empty
i use this
@this->item(row,col)->text().isEmpty(); @
but the programme crashes , what the probleme her ??
-
[quote author="advseo32" date="1374923562"]
@this->item(row,col)->text().isEmpty(); @but the programme crashes , what the probleme her ??[/quote]If there is no data in the cell, then this->item() returns NULL.
Your program will crash if you dereference a null pointer.
-
[quote author="JKSH" date="1374928103"][quote author="advseo32" date="1374923562"]
@this->item(row,col)->text().isEmpty(); @but the programme crashes , what the probleme her ??[/quote]If there is no data in the cell, then this->item() returns NULL.
Your program will crash if you dereference a null pointer.
[/quote]
Yeah! that's true , because QTableWidgetItem was created only when the user fill in the cell
do you have another way to check if the cell if not empty
-
[quote author="advseo32" date="1374942257"]do you have another way to check if the cell if not empty [/quote]If there is no data in the cell, then this->item() returns NULL :)
-
[quote author="JKSH" date="1374942566"][quote author="advseo32" date="1374942257"]do you have another way to check if the cell if not empty [/quote]If there is no data in the cell, then this->item() returns NULL :)[/quote]
Probably , you have give the answer from the the begning , but i haven't pay attention to it
yes it's works
@if (this->item(LastRow,0) != 0)@ -
now
i want to change the behavior of vertical header in Qtableview
this is what i mean:
when user start fill table cells, i want this sign(*) present in vertical header instead of numbers
when user moves beteween rows , i want also this sign(>) present in vertical header instead of numbers
what function i need to implement