Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Special Interest Groups
  3. C++ Gurus
  4. Adding items to a list
Forum Updated to NodeBB v4.3 + New Features

Adding items to a list

Scheduled Pinned Locked Moved C++ Gurus
35 Posts 5 Posters 21.0k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    Monkey666
    wrote on last edited by
    #5

    myList is a listbox widget on the app, and ProcInfo:

    @class ProcInfo
    {
    public:
    HANDLE Proc;
    DWORD Base;
    int ID;
    };@

    1 Reply Last reply
    0
    • D Offline
      D Offline
      dangelog
      wrote on last edited by
      #6

      And exactly what do you want to add to that list? Because there's nothing resembling a string inside your ProcInfo class...

      Software Engineer
      KDAB (UK) Ltd., a KDAB Group company

      1 Reply Last reply
      0
      • M Offline
        M Offline
        Monkey666
        wrote on last edited by
        #7

        I want to add each ProcInfo contained in the list to the listbox, but from your repsonse I am guessing you can't add custom class items to a listbox the same way you can in C#.

        1 Reply Last reply
        0
        • L Offline
          L Offline
          loladiro
          wrote on last edited by
          #8

          even in C# you need to have a ToString method. How would C++ what you actually want to print. That being said. What do you want to print? The id? In that case you could have an implicit cast to QString like:
          @
          class ProcInfo
          {
          public:
          //code
          operator QString() const
          {
          return QString::number(id);
          }
          };
          @
          or you could call QString::number in the loop instead of adding an implicit cast function:
          @
          ui->myList->addItem(QString::number((*p).id));
          @

          1 Reply Last reply
          0
          • M Offline
            M Offline
            Monkey666
            wrote on last edited by
            #9

            [quote author="loladiro" date="1312196973"]even in C# you need to have a ToString method. How would C++ what you actually want to print. [/quote]

            No you don't in C#, because when you create a class it automatically has a base ToString() method which is automatically used in certain controls like listboxes without being called (although the string would be simply the class name unless you override the method) I assumed C++ would be no different but clearly it is.

            Thanks for the help.

            1 Reply Last reply
            0
            • M Offline
              M Offline
              Monkey666
              wrote on last edited by
              #10

              How would I use your operator QString() const method? I can tell I have a long way to go int he conversion from C# to C++ :(

              1 Reply Last reply
              0
              • L Offline
                L Offline
                loladiro
                wrote on last edited by
                #11

                Sorry, I forgot about that in C# (I have only once looked into it and that very briefly). However, if you consider your issue solved, pleas add [Solved] in front of the thread title (by editing the first post).

                1 Reply Last reply
                0
                • M Offline
                  M Offline
                  Monkey666
                  wrote on last edited by
                  #12

                  I can't work out actually how to use your operator QString() const.

                  1 Reply Last reply
                  0
                  • L Offline
                    L Offline
                    loladiro
                    wrote on last edited by
                    #13

                    The posts must have crossed in the air ;). The QString() const method is an "explicit coversion operator":http://msdn.microsoft.com/en-us/library/ts48df3y(v=vs.80).aspx . However, be aware that there are also many bugs that may follow from the misuse of this laguage feature.

                    EDIT: you can use it just like ou would in C# (i.e. without doing anything special)

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      Monkey666
                      wrote on last edited by
                      #14

                      That's what I thought but get compiler error:

                      error: no matching function for call to 'QListWidget::addItem(const ProcInfo&)'

                      1 Reply Last reply
                      0
                      • M Offline
                        M Offline
                        Monkey666
                        wrote on last edited by
                        #15

                        Actually there are more compile errors I should have mentioned which are most likely causing this:

                        error: no match for 'operator=' in 'p = procList.std::list<_Tp, _Alloc>::begin with _Tp = int, _Alloc = std::allocator<int>'

                        1 Reply Last reply
                        0
                        • L Offline
                          L Offline
                          loladiro
                          wrote on last edited by
                          #16

                          Sorry but I can't reproduce. This all works:
                          @
                          class ProcInfo
                          {
                          public:
                          int id;
                          ProcInfo() : id(1234)
                          {}
                          operator QString() const
                          {
                          return QString::number(id);
                          }
                          };

                          void print(QString print)
                          {
                          qDebug() << print;
                          }

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

                          QList< ProcInfo > list1;
                          list1 << ProcInfo();
                          QList< ProcInfo >::const_iterator i = list1.begin();
                          
                          std::list< ProcInfo > list2;
                          list2.push_back(ProcInfo());
                          
                          std::list< ProcInfo >::const_iterator i2 = list2.begin();
                          
                          print(*i2);
                          
                          print (*(i));
                          
                          QListWidget widget;
                          widget.addItem(*i);
                          
                          std::list< ProcInfo >::const_iterator p = list2.begin();
                          
                          for (p=list2.begin();p!=list2.end(); ++p)
                          {
                              widget.addItem(*p);
                          }
                          
                          widget.show();
                          
                          const ProcInfo p2;
                          print(p2);
                          
                          return a.exec(&#41;;
                          

                          }
                          @

                          1 Reply Last reply
                          0
                          • M Offline
                            M Offline
                            Monkey666
                            wrote on last edited by
                            #17

                            Ok I've managed to get rid of all compile errors except this one:

                            error: expected type-specifier before 'QString'

                            And the error points to the operator:

                            @
                            class ProcInfo
                            {
                            public:
                            HANDLE Proc;
                            DWORD Base;
                            int ID;
                            operator QString() const
                            {
                            return QString::number(ID);
                            }
                            };@

                            1 Reply Last reply
                            0
                            • L Offline
                              L Offline
                              loladiro
                              wrote on last edited by
                              #18

                              did you #include <QString>?

                              1 Reply Last reply
                              0
                              • M Offline
                                M Offline
                                Monkey666
                                wrote on last edited by
                                #19

                                That fixed that but now I have another problem /sigh.

                                I have declared std::list<ProcInfo> procList; inside a header file, and that header file is included in the main cpp file which I am doing this all in, however I get error:

                                error: multiple definition of `procList'

                                There is definitely only 1 definition and it's inside the h file so I'm a little confused, maybe c++ isn't for me :(

                                1 Reply Last reply
                                0
                                • L Offline
                                  L Offline
                                  loladiro
                                  wrote on last edited by
                                  #20

                                  There's not much we can do without seeing the header file ...

                                  1 Reply Last reply
                                  0
                                  • M Offline
                                    M Offline
                                    Monkey666
                                    wrote on last edited by
                                    #21

                                    proc.h

                                    @
                                    #include <windows.h>
                                    #include <list>
                                    #include <QString>

                                    #ifndef PROC_H
                                    #define PROC_H

                                    #endif // PROC_H

                                    class ProcInfo
                                    {
                                    public:
                                    HANDLE Proc;
                                    DWORD Base;
                                    int ID;
                                    operator QString() const
                                    {
                                    return QString::number(ID);
                                    }
                                    };

                                    std::list< ProcInfo > procList;

                                    bool createProcessList();
                                    DWORD GetModuleBase(LPSTR lpModuleName, DWORD dwProcessId);
                                    @

                                    proc.cpp

                                    @
                                    #include <windows.h>
                                    #include <iostream>
                                    #include <string>
                                    #include <tlhelp32.h>
                                    #include "proc.h"
                                    #include "misc.h"

                                    using namespace std;

                                    bool createProcessList()
                                    {
                                    PROCESSENTRY32 entry;
                                    entry.dwSize = sizeof(PROCESSENTRY32);

                                    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
                                    
                                    if (Process32First(snapshot, &entry;) == TRUE)
                                    {
                                        while (Process32Next(snapshot, &entry;) == TRUE)
                                        {
                                            char *procName;
                                            strcpy_wc(procName, entry.szExeFile);
                                            if (stricmp(procName, "pol") == 0)
                                            {
                                                ProcInfo *p = new ProcInfo();
                                                p->Proc = OpenProcess(PROCESS_ALL_ACCESS,FALSE,entry.th32ProcessID);
                                                p->ID = entry.th32ProcessID;
                                                p->Base = GetModuleBase("test.dll", entry.th32ProcessID);
                                                procList.push_back(*p);
                                            }
                                        }
                                        if (procList.empty())
                                           return false;
                                        return true;
                                    }
                                    
                                    CloseHandle(snapshot);
                                    return 0;
                                    

                                    }

                                    DWORD GetModuleBase(LPSTR lpModuleName, DWORD dwProcessId)
                                    {
                                    MODULEENTRY32 lpModuleEntry = {0};
                                    HANDLE hSnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwProcessId );
                                    if(!hSnapShot)
                                    return NULL;
                                    lpModuleEntry.dwSize = sizeof(lpModuleEntry);
                                    BOOL bModule = Module32First( hSnapShot, &lpModuleEntry; );
                                    while(bModule)
                                    {
                                    char *foundModule;
                                    strcpy_wc(foundModule, lpModuleEntry.szModule);
                                    if(!strcmp( foundModule, lpModuleName ) )
                                    {
                                    CloseHandle( hSnapShot );
                                    return (DWORD)lpModuleEntry.modBaseAddr;
                                    }
                                    bModule = Module32Next( hSnapShot, &lpModuleEntry; );
                                    }
                                    CloseHandle( hSnapShot );
                                    return NULL;
                                    }
                                    @

                                    That error points to line 11 in proc.cpp.

                                    1 Reply Last reply
                                    0
                                    • L Offline
                                      L Offline
                                      loladiro
                                      wrote on last edited by
                                      #22

                                      Well, my first comment is: fix your "include guards":http://en.wikipedia.org/wiki/Include_guard

                                      1 Reply Last reply
                                      0
                                      • M Offline
                                        M Offline
                                        Monkey666
                                        wrote on last edited by
                                        #23

                                        I'll be honest, I don't really get it :/

                                        1 Reply Last reply
                                        0
                                        • L Offline
                                          L Offline
                                          loladiro
                                          wrote on last edited by
                                          #24

                                          Yes! Let me explain. In C (and C++) an #include directive will include the file regardless of whether it has been included before. You can litterally compare this to copy'n'past-ing the header file into the source code whenever there is an #include directive. The include guards are used to make sure every header file is only included once. E.g. if your header file would usually be
                                          @
                                          class Dummy
                                          {};
                                          @
                                          you'd have to use
                                          @
                                          #ifndef DUMMY_H //i.e. if dummy.h has never been included before
                                          #define DUMMY_H //remember that it has been included

                                          class Dummy
                                          {};

                                          #endif //endif after all statements
                                          @
                                          In your case the include guards have to enclose all of your statements (the header files not necessarily because they have their own include guards, but it's usually best to have the include guards be the first and last satements in your header files)

                                          1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved