Adding email functionality in QtreeWidget--Urgent reply needed



  • I am trying to make an organization browser. I am suppose to add a functionality that makes possible to send email by right clicking on the name. There should be an option that displays send email after right click. Then the email client should open after it. I dont know where to right the code for it. Do I need to make a separate class. Below is my code: till now in the .cpp file. Also help in what to include in the header file.

    #include "dialog.h"
    #include "ui_dialog.h"
    #include <QtCore>
    #include <QtGui>
    #include <QTreeWidgetItem>
    #include <iostream>
    #include <QLabel>
    #include <QDesktopServices>

    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()
           << "CDSID" <<"First Name"<< "Last Name" <<"Role"<< "Reports To" << "Cube");
    
    AddRoot("Organization Browser","\0","\0", "\0", "\0","\0");
    

    }
    void Dialog::AddRoot( QString CDSID, QString Fname, QString Lname, QString Role, QString ReportsTo, QString Cube)
    {
    QTreeWidgetItem *itm = new QTreeWidgetItem(ui->treeWidget);
    QTreeWidgetItem *itm1 = new QTreeWidgetItem();

        itm->setText(0,CDSID);
        itm->setText(1,Fname);
        itm->setText(2,Lname);
        itm->setText(3,Role);
        itm->setText(4,ReportsTo);
        itm->setText(5,Cube);
    
        ui->treeWidget->addTopLevelItem(itm);
    
        AddChild(itm,"JOSTROW7","x","x", "v", "c","d");
        AddChild(itm1,"CDSID","First Name","Last Name", "Role", "Reports To","Cube");
    

    }
    void Dialog::AddChild(QTreeWidgetItem *parent, QString CDSID, QString Fname, QString Lname, QString Role, QString ReportsTo, QString Cube)
    {
    QTreeWidgetItem *itm = new QTreeWidgetItem();
    itm->setText(0,CDSID);
    itm->setText(1,Fname);
    itm->setText(2,Lname);
    itm->setText(3,Role);
    itm->setText(4,ReportsTo);
    itm->setText(5,Cube);
    parent->addChild(itm);

    // Reports to Jeff(All are Supervisors)
    

    QTreeWidgetItem *k_itm=new QTreeWidgetItem(itm,QStringList() <<"3"<<"9"<<"9"<<"2"<<"1"<<"D701\n");
    QTreeWidgetItem *s_itm=new QTreeWidgetItem(itm,QStringList() <<"llj"<<"ll"<<"0"<<"111"<<"91"<<"4\n");

    // Reports to 1
    new QTreeWidgetItem(k_itm,QStringList() <<"F"<<"D"<<"W"<<"B"<<"BBB"<<"F");

    }

    void Dialog::on_pushButton_clicked()
    {
    QLabel label("<a href='mailto:someone@somewhere.com'>email someone</a>");
    label.setOpenExternalLinks(true);
    label.show();

    QLabel label("<a href='mailto:someone@somewhere.com'>email someone</a>");
    label.connect(&label, &QLabel::linkActivated, [](const QString &link)
    {
    QDesktopServices:openUrl(QUrl(link));
    });
    label.show();
    

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


  • Qt Champions 2016

    Hi and welcome
    Its not clear what part is not working.
    However, i noted the following:
    You are creating the QLabel as local variable.
    It will not survive after on_pushButton_clicked() ends so
    is that what you intend?

    void Dialog::on_pushButton_clicked()
    {
    QLabel label("<a href='mailto:someone@somewhere.com'>email someone</a>");
    label.setOpenExternalLinks(true);
    label.show();
    ..
    }

    Also , i think you can just use
    http://doc.qt.io/qt-5/qdesktopservices.html
    for it.
    "If a mailto URL is specified, the user's e-mail client will be used to open a composer window containing the options specified in the URL, similar to the way mailto links are handled by a Web browser."



  • I have another problem with respect to sending more than one emails.
    I can select multiple rows via mouse or keyboard from the tree, but when I click send email, it sends only to the currentItem. I tried to use selecteditems, but in vain. Below is how the code looks for the email part. I think some function is missing that allows me to send the emails to all the selected Items. Note: data(0,0) is the first column that has the email addresses.

    QString strTo = "mailto:";
    strTo.append(ui->treeWidget->currentItem()->data(0,0).toString());

        openUrl->openUrl(QUrl(strTo));

  • Qt Champions 2016

    Hi

    • I tried to use selecteditems, but in vain.

    something like ?

    void SendMail(QString email) {
    QString strTo = "mailto:";
    strTo.append(email);
    openUrl->openUrl(QUrl(strTo));
    }

    QList<QTreeWidgetItem *> itemList;
    itemList = this->MyTree->selectedItems();
    foreach(QTreeWidgetItem *item, itemList)
    {
    QString str = item->data(0,0).toString());
    SendEmail(str);
    }



  • Thanks for the reply. It worked. Lastly I need to add some more functionality. I added check boxed to each item. Now If I check the root I need all the items to be checked. If I select a child all the subchilds of it should be checked. Moreover, after clicking the send email, it should send the email to all the checked boxes. Also, I dont need the selection feature (I need only checked feature)
    Below is the code I am struggling with:

    void Dialog::on_pushButton_clicked()
    
    {
         //Send Email
    
        QList<QTreeWidgetItem *> itemList;
      itemList = ui->treeWidget->selectedItems();
    
        QString strTo = "mailto:";
    
       foreach(QTreeWidgetItem *item, itemList)
       {
     //    if(item->text(0)=="Organization")
        //     continue;
    
           if(item->checkState(0)== Qt::Checked)
    {
         
              strTo.append(item->text(0)+";");
        }
    }
        openUrl->openUrl(QUrl(strTo));
    }
    

  • Qt Champions 2016

    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#details

    To process all checked items.

    Alternatively this is also possible:
    http://stackoverflow.com/questions/9986231/getting-a-qtreewidgetitem-list-again-from-qtreewidget

    doStuffWithEveryItemInMyTree( 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.

    1. 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.

    2. 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.

    3. 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.

    1. Org (Clicking this will select all)
      1. Senior Manager (Clicking this will select all managers only)
      2. Manager (Clicking this will select all employees under him)
        1. 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 paste

    const 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 form ui->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 because QStandrdItemModel, which runs under the hood of QTreeWidget, sends always an empty vector as third argument of dataChange. I hope some of the ginuses roaming around here have a better solution



  • @iqbalfaheem21

    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.



  • sorry, my bad, I had this: for(int j=0;i /* i instead of j*/ <model->columnCount(parent );++j){

    corrected now



  • Still it is getting crashed. I guess there should be some other way.


  • Qt Champions 2016

    @iqbalfaheem21

    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 :)

    http://doc.qt.io/qtcreator/creator-debugging.html



  • @mrjj

    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 Email

    QList<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).


  • Qt Champions 2016

    @iqbalfaheem21

    Hi @VRonin already gave you the code in
    https://forum.qt.io/topic/71237/adding-email-functionality-in-qtreewidget-urgent-reply-needed/7

    You 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));


  • Qt Champions 2016



  • 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.


  • Qt Champions 2016

    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 :)



  • @mrjj

    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.


  • Qt Champions 2016

    Ok, what is "the access file"
    a db file, a text file or what is it?



  • @mrjj

    A .accdb file


  • Qt Champions 2016

    @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 use

    db.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/#p127

    If you run into issue, there are many posts on google and this forum on how to use Access with Qt.



  • @mrjj
    Can you send me the exact possible code for this?


  • Qt Champions 2016

    @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 Qt

    http://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



  • @mrjj

    Forget about SharePoint. Just a code to read data from MS Access file in Qt application.


  • Qt Champions 2016

    @iqbalfaheem21
    You do it like any other database
    http://doc.qt.io/qt-5/qsqldatabase.html
    the connect line is different. read the docs for it.
    db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};DBQ=c:/test.accdb");

    then use
    http://doc.qt.io/qt-5/qsqlquery.html
    to read data.
    QSqlQuery query("SELECT country FROM artist");
    while (query.next()) {
    QString country = query.value(0).toString();
    doSomething(country);
    }



  • @mrjj

    I am able to connect to the database. Now I need to call the data from the database in such a way that it is displayed in a tree format. Like parent child. Just like if we use filesystem model, all the drives and folders are displayed.
    And now if I want to iterate I cannot do that because I am using treeview not treeWidget. So I cant use QtreeWidgetItemIterator. So how to iterate also is a question for me.


  • Qt Champions 2016

    When you are using a view, you must use a model.
    The widget version is item based and has hidden model
    for that but A view wants a model from you or
    one of the predefined
    http://doc.qt.io/qt-5/sql-model.html

    If read-only is ok then
    http://doc.qt.io/qt-5/qsqlquerymodel.html#details
    might be useful.



  • @mrjj

    I only need a read model. But when it reads from the database, it should display the data in treewidget format. Dont know how to do that. It is easy to display in rows and columns, but tough to display in tree. Kindly assist.



  • You need to execute the query manually and add the data to the model or widget. I have an example using a QStandardItemModel here: https://github.com/VSRonin/FXhelper/blob/master/FXhelperApp/PortfoliosTab.cpp#L4220



  • @VRonin

    I am able to connect to the database. But how to get the data in a tree view. Do I need to pull the data in a treeview format?
    the data in the database has no parent child relation. I am lost?



  • There is no magically working solution, you have to iterate through each record of the query and build your tree model manually (using QStandardItemModel?)



  • @VRonin said in Adding email functionality in QtreeWidget--Urgent reply needed:

    using

    But using QStandardItemModel will compel me to specify the data. For example, reportsto name("John").QStandardItem(0,1,"Adam"); I want a general code that will keep working fine even if the employees changes. I need to do mapping and dont know how to do it. Any example please?



  • @iqbalfaheem21 said in Adding email functionality in QtreeWidget--Urgent reply needed:

    But using QStandardItemModel will compel me to specify the data

    No, common misconception though.
    you can use QStandardItem::setData to specify the content of a single item or, and this is what I suggest, stick with just using QAbstactItemModel interface either explicitly (declaring the model something like: QAbstactItemModel *model =new QStandardItemModel(parent); ) or limiting yourself in the methods you call. in this case you can use QAbstactItemModel::insertRows, QAbstactItemModel::insertColumns and QAbstactItemModel::setData to populate your model.

    The explicit use of the interface also allows you, in case further into development you realise you QStandardItemModel is too slow or doesn't suit your needs, to change the model just by changing the constructor call (the line with new) and everything will work out of the box

    @iqbalfaheem21 said in Adding email functionality in QtreeWidget--Urgent reply needed:

    Any example please?

    I linked it above, https://github.com/VSRonin/FXhelper/blob/master/FXhelperApp/PortfoliosTab.cpp#L4220



  • @VRonin

    Okay just help me in the code that will index the parent child mapping. Below code I got online. Tried to implement it, but in vain.

    QSqlQuery q;
    QStandardItemModel *myModel;
    q = db->atpSelect("SELECT * FROM group_tbl");
    myModel->clear();
    myModel->setColumnCount(3);
    myModel->setHeaderData(0, Qt::Horizontal,"Name");
    myModel->setHeaderData(1, Qt::Horizontal,"ID");
    myModel->setHeaderData(2, Qt::Horizontal,"Parent");
    
    QStandardItem *parent;
    while(q.next()) {
    
    int id = q.value(0).toInt();
    QString name = q.value(1).toString();
    int parentId = q.value(2).toInt();
    
    QStandardItem *pId = new QStandardItem(QString::number(id));
    QStandardItem *pName = new QStandardItem(name);
    QStandardItem *pParentId = new QStandardItem(QString::number(parentId));
    
    QList<QStandardItem *> row;
    row.append(pName);
    row.append(pId);
    row.append(pParentId);
    
    rowItemMap.insert(id, pName);
    
    if (parentId == 0 && id != 0) {
    myModel->appendRow(row);
    } else {
    parent = rowItemMap[parentId];
    parent->appendRow(row);
    }
    }
    


  • You can add email functionality by Office 365 web part or SharePoint designer. With the help of web part, you can easily add the email id after implementing the SharePoint or Cloud.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.