Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Calling function with variable arguments having a QStringList
Forum Updated to NodeBB v4.3 + New Features

Calling function with variable arguments having a QStringList

Scheduled Pinned Locked Moved General and Desktop
1 Posts 1 Posters 3.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.
  • F Offline
    F Offline
    fanoOne
    wrote on last edited by
    #1

    Hy to all I have a GUI application that at work we use to test the creations of Qt Widget itself, for example I have a dialog to create a QMessageBox with favourited properties icon, title, message and button of Qt or custom (you write the text on a list).

    All this data are send using a json and the buttons are memorized in QStringList, I have a C function that creates the json, that normally it would called in C but now I want to call in C++, but how convert the QStringList in the "..." (va_list de facto?).

    This is the prototype of the function that I want use:

    @
    void messagebox(json_object **json, char *iconType, char *title, char msg, int showTime, ...
    /
    char *btn1, char *btn2, ... */ );
    @

    I cannot change the signature of the function to use a QStringList as it have to be used by a plain C application...

    I have found a solution that in Windows XP works, but, obviusly is not really portable:

    @
    void foo(int n, va_list args)
    {
    int i = 0;

    printf("[foo] n is %d and i is %d\n", n, i);
    
    for (; i != n; ++i)
        printf("'%s'\n", va_arg(args, char *));
    
    printf("I'm here... safe!\n");
    

    }

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

    QStringList args = a.arguments();
    
    QVector<char *> v;
    
    // It works but I need to allocate memory as QString::toAscii().data() is not saved in 'v' I don' know why!
    foreach (QString a, args) {
        //char str[strlen(a.toAscii().data()) + 1];
        char *str = strdup(a.toAscii().data());
    
        //strcpy(str, a.toAscii().data());
        printf("adding to v: '%s'\n", a.toAscii().data());
        v << str;
    }
    

    foo(args.count(), reinterpret_cast<va_list>((v.data())));

    // Now I need to free() str  in v or not? If it was a real function and not main() I has a memory leak here or not?
    return 0;
    

    }
    @

    As you could see it is a Kludge it incredibly works as, at least in Windows, va_list is, in reality a char *, I'm unsure on Linux (where I have to do this tomorrow). So I pass all the strings one after another to the "foo" function...

    At least I'd like to use a vector of QString to avoid the allocation of memory but I cannot find a way, data() in this case would be what a QString? Or QString *? Or a QString[]?

    By the way if my PM see that code probably he will kill me so I'm asking to you there's a more portable solution in Qt to this problem?

    For example supposing that could be happy with max 32 buttons MOC could automate the scripture of code as this:

    @
    QStringList buttons;

    switch(buttons) {
    case 0: // We have no buttons so I could call messagebox() w/o the last arg
    messagebox(json_object **json, char *iconType, char *title, char *msg, int showTime);
    break;

    case 1: // We have only one buttons simple is the first element of the list...
       messagebox(json_object **json, char *iconType, char *title, char *msg, int showTime, buttons[0]);
       break;
    

    case 2: /* 2 buttons they're in index 0 and 1 */
    messagebox(json_object **json, char *iconType, char *title, char msg, int showTime, buttons[0], buttons[1]);
    break;
    .... /
    3-4-5-6-7-... buttons */
    case 31:
    messagebox(json_object **json, char *iconType, char *title, char *msg, int showTime, buttons[0], buttons[1], buttons[2], buttons[3], buttons[4], buttons[5], [...], buttons[31]);
    break;
    }
    @

    What do you think? Is this possible?

    Thanks for your attention...

    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