Adding email functionality in QtreeWidget--Urgent reply needed
-
Hi
Ok checked is not the same as selected so- itemList = ui->treeWidget->selectedItems();
is not really what u want as that is selected not checked so unless they are ALSO selected
the list is empty.You can use
http://doc.qt.io/qt-5/qtreewidgetitemiterator.html#detailsTo process all checked items.
Alternatively this is also possible:
http://stackoverflow.com/questions/9986231/getting-a-qtreewidgetitem-list-again-from-qtreewidgetdoStuffWithEveryItemInMyTree( tree->invisibleRootItem() ); void doStuffWithEveryItemInMyTree( QTreeWidgetItem *item ) { // Do something with item ... for( int i = 0; i < item->childCount(); ++i ) doStuffWithEveryItemInMyTree( item->child(i) ); }
-
QStringList getCheckedAdresses(const QAbstractItemModel* model, const QModelIndex& parent = QModelIndex()){ QStringList result; if(!model) return result; if(parent.isValid()){ if(parent.model()!=model) return result; } for(int i=0;i<model->rowCount(parent );++i){ for(int j=0;j<model->columnCount(parent );++j){ const QModelIndex currIdx=model->index(i,j,parent); if(currIdx.data(Qt::CheckStateRole).toInt()) result.append(currIdx.data().toString()); if(model->hasChildren(currIdx)) result.append(getCheckedAdresses(model,currIdx)); } } return result; }
then use it in
const QStringList adresses = getCheckedAdresses(ui->treeWidget->model()); if(!adresses.isEmpty()) openUrl->openUrl(QUrl("mailto:"+adresses.join(';')));
-
Okay. I am totally lost. Below is my complete code. So anyone please give me the exact solution according to my scenario. That will be a great help.
Please note: I want 3 functionalities.
-
If I check the parent node, all the children under get be checked. Later when I click send email, the email be sent to all the checked ones.
-
If I check a child node, any subchild under it be checked. Later when I click send email, the email be sent to all the checked ones.
-
If I check a child node, that does not have any child, only it should be checked. Later when I click send email, the email be sent to all the checked ones.
Also, I have made lined between different items. There are four levels.
- Org (Clicking this will select all)
2) Senior Manager (Clicking this will select all managers only)
3) Manager (Clicking this will select all employees under him)
4) Employee (Clicking this will select only him)
#include "dialog.h" #include "ui_dialog.h" #include <QtCore> #include <QtGui> #include <QTreeWidgetItem> #include <iostream> #include <QLabel> #include <QDesktopServices> #include <QList> #include <QApplication> #include <QAbstractItemView> Dialog::Dialog(QWidget *parent) : QMainWindow(parent), ui(new Ui::Dialog) { ui->setupUi(this); ui->treeWidget->setColumnCount(6); ui->treeWidget->setColumnWidth(0,200); ui->treeWidget->setColumnWidth(1,200); ui->treeWidget->setColumnWidth(2,200); ui->treeWidget->setColumnWidth(3,200); ui->treeWidget->setColumnWidth(4,200); ui->treeWidget->setColumnWidth(5,200); ui->treeWidget->setHeaderLabels(QStringList() << Email<<"First Name"<< "Last Name" <<"Role"<<"Boss "<< "Desk"; AddRoot("Org","\0","\0", "\0", "\0","\0"); } void Dialog::AddRoot( QString email, QString Fname, QString Lname, QString Role, QString ReportsTo, QString Desk; { QTreeWidgetItem *itm = new QTreeWidgetItem(ui->treeWidget); itm->setText(0,Email); itm->setText(1,Fname); itm->setText(2,Lname); itm->setText(3,Role); itm->setText(4, Boss); itm->setTextDesk itm->setCheckState(0,Qt::Unchecked); ui->treeWidget->addTopLevelItem(itm); AddChild(itm,"abc","qqq","www", "zzz", "ddds","111"); ui->treeWidget->setSelectionBehavior(QAbstractItemView::SelectRows); ui->treeWidget->setSelectionMode(QAbstractItemView::MultiSelection); } void Dialog::AddChild(QTreeWidgetItem *parent, QString Email, QString Fname, QString Lname, QString Role, QString Boss, QString Desk) { QTreeWidgetItem *itm = new QTreeWidgetItem(); itm->setText(0,Email); itm->setText(1,Fname); itm->setText(2,Lname); itm->setText(3,Role); itm->setText(4,Boss); itm->setText(5,Desk); itm->setFlags(itm->flags() | Qt::ItemIsUserCheckable); itm->setCheckState(0,Qt::Unchecked); parent->addChild(itm); QTreeWidgetItem *k_itm=new QTreeWidgetItem(itm,QStringList() <<"bbb"<<"vvv"<<"1111\n"); k_itm->setCheckState(0,Qt::Unchecked); QTreeWidgetItem *s_itm=new QTreeWidgetItem(itm,QStringList() <<"ccc"<<"lll"<<"1111\n"); s_itm->setCheckState(0,Qt::Unchecked); QTreeWidgetItem *e_itm=new QTreeWidgetItem(itm, QStringList()<< "ddd"<<"oooo"<<"1111\n"); e_itm->setCheckState(0,Qt::Unchecked); QTreeWidgetItem *y_itm=new QTreeWidgetItem(itm, QStringList()<< "eee"<<"jjj"<<"1111\n"); y_itm->setCheckState(0,Qt::Unchecked); QTreeWidgetItem *sk_itm=new QTreeWidgetItem(itm, QStringList()<< "fff"<<"rrr""1111\n"); sk_itm->setCheckState(0,Qt::Unchecked); QTreeWidgetItem *b_itm=new QTreeWidgetItem(itm, QStringList()<< "ggg"<<"eee"<<"1111"); b_itm->setCheckState(0,Qt::Unchecked); QTreeWidgetItem *j_itm=new QTreeWidgetItem(itm, QStringList()<< "hhh"<<"eee"<<"1111 \n"); j_itm->setCheckState(0,Qt::Unchecked); QTreeWidgetItem *h_itm=new QTreeWidgetItem(itm,QStringList() <<"iii"<<"yyy"<<"1111 \n"); h_itm->setCheckState(0,Qt::Unchecked); new QTreeWidgetItem(itm,QStringList() <<"jjj"<<"xxx"<<"1111 \n"); QTreeWidgetItem *qqq = new QTreeWidgetItem(*k_itm,QStringList() <<"qqq"<<"qwqe"<<"1111"); qqq->setCheckState(0,Qt::Unchecked); QTreeWidgetItem *www =new QTreeWidgetItem(s_itm,QStringList() <<"www"<<"nun"<<"1111"); www->setCheckState(0,Qt::Unchecked); QTreeWidgetItem *eee= new QTreeWidgetItem(e_itm,QStringList() <<"eee"<<"vvv"<<"1111"); eee->setCheckState(0,Qt::Unchecked); QTreeWidgetItem *nnn = new QTreeWidgetItem(e_itm,QStringList() <<"nnn"<<"nhn"<<"1111"); nnn->setCheckState(0,Qt::Unchecked); QTreeWidgetItem *pop = new QTreeWidgetItem(y_itm,QStringList() <<"pop"<<"fff"<<"1111 "); pop->setCheckState(0,Qt::Unchecked); QTreeWidgetItem *zaz = new QTreeWidgetItem(sk_itm,QStringList() <<"zaz"<<"fgf"<<"1111"); zaz->setCheckState(0,Qt::Unchecked); QTreeWidgetItem *xsxs = new QTreeWidgetItem(b_itm,QStringList() <<"xsxs"<<"yhgf"<<"1111 "); xsxs->setCheckState(0,Qt::Unchecked); QTreeWidgetItem *cdcd = new QTreeWidgetItem(j_itm,QStringList() <<"cdcd"<<"poj"<<"1111"); cdcd->setCheckState(0,Qt::Unchecked); QTreeWidgetItem *vfvf = new QTreeWidgetItem(h_itm,QStringList() <<"vfvf"<<"fvf"<<"1111"); vfvf->setCheckState(0,Qt::Unchecked); } Dialog::~Dialog() { delete ui; } void Dialog::on_pushButton_clicked() { //Send Email QList<QTreeWidgetItem *> itemList; itemList = ui->treeWidget->selectedItems(); QString strTo = "mailto:"; foreach(QTreeWidgetItem *item, itemList) { if(item->checkState(0)== Qt::Checked) // if(item->checkState(0)== Qt::Checked){ strTo.append(item->text(0)+";"); } // if(item->checkState(0)== Qt::Checked) // { ui->treeWidget->; // } openUrl->openUrl(QUrl(strTo)); }
-
-
Later when I click send email, the email be sent to all the checked ones.
put my
getCheckedAdresses
function from above somewhere in your code (a private member of Dialog or just pasting it at the top of the .cpp file, after the includes)then delete everything in
Dialog::on_pushButton_clicked
and pasteconst QStringList adresses = getCheckedAdresses(ui->treeWidget->model()); if(!adresses.isEmpty()) openUrl->openUrl(QUrl("mailto:"+adresses.join(';')));
for the parent-checks-the-child I don't think it's that straightforward, you'll probably have to store the check state twice in two roles then when
dataChange
signal is emitted formui->treeWidget->model()
you have to check if the 2 check roles match and if they don't then the check canged and you should check the cildren. All this becauseQStandrdItemModel
, which runs under the hood ofQTreeWidget
, sends always an empty vector as third argument ofdataChange
. I hope some of the ginuses roaming around here have a better solution -
The program is getting crashed when I click the send email button.
There should be some solution. I think I am missing some functions. Hope somebody replies soon with the solution. -
Still it is getting crashed. I guess there should be some other way.
-
You could debug it ? ;)
place a breakpoint in the slot for the Send Email
button and single step from there.That should give us the exact line where it crashes and hopefully also why it crashes :)
-
Okay. I am still unable to do. However, in the .ui file, I found a way that we can just drag n drop a treewidget and add the items. I just need to do one thing now. i.e iteration and send emails to the checked ones. The items can be accessed by ui->treeWidget. I can send emails to the selected ones by:
void MainWindow::on_pushButton_clicked()
{
//Send EmailQList<QTreeWidgetItem *> itemList; itemList = ui->treeWidget->selectedItems(); QString strTo = "mailto:"; foreach(QTreeWidgetItem *item, itemList) { if(item->checkState(0)== Qt::Checked) strTo.append(item->text(0)+";");
}
{ ui->treeWidget->;} openUrl->openUrl(QUrl(strTo));
}
But I dont want the selection functionality. I only want checked functionality. That means, if an item is checked, email will be send to it.
Please provide the code for the iteration of items in the treewidget (iteration of all, parents and child). -
Hi @VRonin already gave you the code in
https://forum.qt.io/topic/71237/adding-email-functionality-in-qtreewidget-urgent-reply-needed/7You cannot use selectedItems(); since you want the Checked ones.
You need to do it recursively as @VRonin shows.
for(int i=0;i<model->rowCount(parent );++i){
....
if(model->hasChildren(currIdx)) ...
result.append(getCheckedAdresses(model,currIdx)); <<<<< here it calls itself again. So it processes its children too, and its children and its children and..
.... -
@mrjj said in Adding email functionality in QtreeWidget--Urgent reply needed:
if(model->hasChildren(currIdx)) ...
I did it in other way. Simple and easy.
QString strTo = "mailto:";
QTreeWidgetItemIterator item(ui->treeWidget);
while (*item) {
if ((*item)->checkState(0) == Qt::Checked)
strTo.append((*item)->text(0)+";");
++item;
}
openUrl->openUrl(QUrl(strTo)); -
@iqbalfaheem21
super. -
Ouch. One more functionality needed to be added. I request all my folks to please assist me in this as well.
Now I need to get the data from the SharePoint site. So what can be the code in Qt that can get the data from SharePoint and work in the same manner. So, in other words, it will get the data from SharePoint, and display all the data from it. Then whatever is checked from the tree will be included with the "mailto:" string.
So basically, no hard coding but getting the data from Sharepoint.
Pleae let mek now. -
Hi
- get the data from the SharePoint site
From rest service ?
From SQL server ?
From ?
What data ?
Unless the SharePoint devs knows 100% what you mean, i doubt
there be many answer :)
Maybe I just dont know SharePoint well enough :) - get the data from the SharePoint site
-
I am linking the sharepoint data with an access file. Now I need to connect the access file with the Qt application that I made. So I need the code to connect to the access file, read the data from there and display it.. Also let me know where to write the code. In the header file, main.cpp, mainwindow.cpp or somewhere else.
-
Ok, what is "the access file"
a db file, a text file or what is it? -
@iqbalfaheem21 said in Adding email functionality in QtreeWidget--Urgent reply needed:
.accdb
"ACCDB files can be opened with Microsoft Access (version 2007 and newer)."
So you need to use install driver and set it up.
then you can usedb.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};DBQ=c:/test.accdb");
https://www.microsoft.com/en-us/download/details.aspx?id=13255
You might need some ODBC also. Not sure. Did Not use Access for many years.
Also pay HUUUUUUUUUUUUUUGE notice to the connection string. its always an issue :)
https://www.connectionstrings.com/access-2007/#p127If you run into issue, there are many posts on google and this forum on how to use Access with Qt.
-
@iqbalfaheem21
That is really not possible as you will need a ODBC + Access driver installed and have exact accdb
to open etc. This you must master yourself.You could start with small sample and try to get a database open.
There are many examples on the internet but you could start
practice with the ones from Qthttp://doc.qt.io/qt-5/examples-sql.html
and try with with sqllite.
then when you understand how database and
http://doc.qt.io/qt-5/qsqlquery.html
works then try to open the accdb file.
You will need this to read the data anyways. You can also ask here for help but
you need a bit of SQL and database+qsqlquery