Advice about the application I will be making? (I'm a beginner)



  • So the application that I will be making is kinda Quiz game with different topics. So I probably need more than 60 pages/window to make it and I have no idea how will I do it.

    It was my first time making an app and using Qt. Could anyone give some advice about the things I should consider or guide me on how to do it?

    Thanks in advance :)


  • Lifetime Qt Champion

    Hi
    well, first you should consider what data that makes up a question/quiz item.
    Im just assuming here as i don't know what the quiz is about.
    Let say we have a Question that can have a title and 2 or more answers and
    maybe also a category.
    The first step would be to define a structure to hold this information
    like
    struct Question {
    QString Title;
    QStringList Answers;
    QString Category;
    }

    That we would keep in a list
    QList<Question> AllQuestions.

    so we can take them from there to show on screen.

    To help more, can you please tell a bit about how it should work ?
    shall it select random questions from all categories or keep track of which one
    already been used etc.

    • Write a list of how it should work.
      Not so much how you wil code it, just the requirements for the app.
      I assume you also need to load questions from file ?

    Im not sure you really need 60 pages as we could also just show one or more
    questions at a time and when we press Next, simply load new ones. (from the list)



  • This post is deleted!


  • I have no idea how I'm going to handle an enormous amount of data. Each Topic has 3 difficulty level with 5 questions each. To sum it up, the total of questions are 75.

    Can I use Stack Widget in QT Widget Application for this app or is there any other way of doing this? Please let me know :)

    Thanks in advance.


  • Lifetime Qt Champion

    @dvlpr.bernard
    Hi
    QStackWidget will fit pretty fine for the pages with Topic/Level/num questions.
    Notice that Widgets can be styled (much like css for web)
    and you can build the ap first using the normal look and after apply a stylesheet to get the exact look.
    https://doc.qt.io/qt-5/stylesheet-reference.html

    The wrong / Correct answer could be a QDialog subclass that pops over the Stacked.

    If you come from web/html side, are you used to databases ?
    This would fit nicely to store the categories and questions in sqllite db.
    Qt has great support for it. However, this requires you to know SQL somewhat.

    Btw: do you want to make this a phone app ?



  • @mrjj
    Uhmmm. Yes, I did recognize that stylesheet it's kinda like css or maybe it is a true css.
    I'll take note of that QDialog.

    No, I had not used a database before and sqlite sounds interesting to me. Is it the key to manage my data? I'll take note of that.

    Yes, it is for a phone. Thank you again for your response :)


  • Lifetime Qt Champion

    @dvlpr.bernard
    ah. well while QWidgets are also fine for phone apps, there is also QML
    https://doc.qt.io/qt-5/qtqml-index.html
    Which was designed for the mobile generation.
    It allows much freedom in look and fell and are fully touch enabled and optimized for mobile usage.
    It is however, very different from c++.

    I suggest you try it out and see if that would not be a better fit.
    https://qmlbook.github.io/

    some c++ might be needed to create the data backend.

    But much of the logic will be javascript.



  • @mrjj
    I see. Is there a touch-enabled for QT Widget Application? Or the user wouldn't be able to feel that it is made for mobile and not for desktop?

    I actually have no time to learn many things because of the deadline. Less than a month it will be presented in our school so what do you think is the best cave to go in to?


  • Lifetime Qt Champion

    @dvlpr.bernard
    hi
    Well QWidgets does support touch to some degree. Like clicking/pressing,
    but not so much slide/swipe and the other normal mobile gestures.
    Also scrollbars and the like are default too small to use. (but its fixable)

    Well if you know javascript besides c++ then QML is pretty smooth.
    If you have not worked with javascript and c++ is more your thing, i would
    go with QWidgets.

    That said. If you know web development, have you considered a browser-based solution?

    What is your main programming language ?



  • I will consider looking at QML. QWidget was my first choice for now.

    My main programming language is C++. I have not done any javascript before. And I probably don't wanna go with browser-based solution because the required language for our project is c++.


  • Lifetime Qt Champion

    @dvlpr.bernard
    Ok, c++ it is.
    The Stacked widget should work fine.
    However, regarding the sqllite database. Im not sure its worth digging into
    SQL for mere 75 questions.
    You could just as easy store it in a text file or for a bit more structure use JSON which
    Qt has direct support for.



  • @mrjj
    Sorry but, can you Elaborate? I don't need SQLite because JSON could do the work for me?
    Thank you :)



  • @mrjj
    Hi. I will try to learn QML. What do you think is the best fit for my app the QT Quick Application - Stack or QT Quick Application - Swipe?
    And what are the best resources to learn it out there?

    Thank you again in advance :)



  • QML seems pretty gorgeous with the user interface. But how am I'm going to work with the back-end kinda stuff??



  • @mrjj
    If Javascript is the language for QML then that would be bad because the required languange for the app is c++.





  • @mrjj Good day sir!

    I was just wondering how am I going to present the data? Should I store all the interface in one Stack Widget or do I need another window or another Stack Widget? :)

    And also I consider looking at SQLite. Where would I store the questions kinda thing or the output to compare to the user input? Thank you again in advance :)
    0_1555859866247_0c9e3a4f-a3af-45bd-8af3-b4e50e870d9c-image.png



  • Or it should look like these?
    What are the things I need to consider :)

    0_1555861384574_636d3370-b62b-4ed1-9b49-cdc8e65c107e-image.png


  • Lifetime Qt Champion

    Hi
    Last table looks ok. I assume then all question is a topic and the answer is some
    text. No mutiple choice or anything like that ?

    Since we will have few questions (75) its ok to include the difficult_level
    as text. If we were to have thousands of questions, it would be better to have a table for the texts ( Beginner, Average etc) and reference it from Question table.
    However, we just directly included it here for simplicity.

    Next step could be to try use table in Qt
    https://doc.qt.io/qt-5/qtsql-index.html
    https://katecpp.wordpress.com/2015/08/28/sqlite-with-qt/

    Things to consider:
    Define the operations you need, like
    select questions from a diff_level
    keeping track of already used questions (if needed ?)



  • I was just wondering how am I going to present the data? Should I store all the interface in one Stack Widget or do I need another window or another Stack Widget? :)

    I suppose you pretent to use QML. So you can store the data in a model and display components on window depending of your data.

    Swipe View
    Stack View

    Below is a idea of how you could to implement it with Swipe View (No Interative Mode)

    // Qt 5.11
    import QtQuick 2.11
    import QtQuick.Window 2.11
    import QtQuick.Controls 2.2
    import QtQuick.Layouts 1.11
    
    Window {
        visible: true
        width: 640
        height: 480
        title: qsTr("Hello World")
    
        ListModel{
            id: databaseModel
            ListElement{
                topic: "While Loop"
                dificulty: 3
                question_num: 3
                question_text: "While Loop 3,3"
            }
    
            ListElement{
                topic: "While Loop"
                dificulty: 3
                question_num: 4
                question_text: "While Loop 3,4"
            }
        }
    
        SwipeView {
            id: view
            anchors.fill: parent
            anchors.bottomMargin: 20
            interactive: false
            currentIndex: pageIndicator.currentIndex
            Repeater {
                model: databaseModel
                Loader {
                    active: SwipeView.isCurrentItem || SwipeView.isNextItem || SwipeView.isPreviousItem
                    sourceComponent: Page{
                        Rectangle{
                            width: view.width / 2
                            height: view.height / 2
                            color: "white"
                            anchors.centerIn: parent
    
                            Text{
                                anchors.centerIn: parent
                                text: "Question: " + model.question_text
                            }
                        }
                    }
                }
            }
        }
    
        PageIndicator {
            id: pageIndicator
            count: databaseModel.count
            interactive: true
            currentIndex: 0
            anchors.bottom: parent.bottom
            anchors.horizontalCenter: parent.horizontalCenter
    
        }
    
    }
    

    Note: the listModel (Data) and Game Logic can be implemented from c++.

    And also I consider looking at SQLite. Where would I store the questions kinda thing or the output to compare to the user input? Thank you again in advance :)

    Firstly, it may be implement of several ways...
    You can insert a Json text with correct_answer index and answers.
    Or create an array of text and correct_answer field (i'm not sure how it could be implemented).

    Json Example:

    {
       "correct_answer": 0,
       "answers": [
          "Answer 1",
          "Answer 2",
          "Answer 3"
       ]
    }
    

    Also, the difficulty_level don't need to be a string field. You can storage an intenger number 1-3 and interpret it in your app. 1 -> Beginner, 2 -> Intermediate.

    I recommend you to read these materials to understand the Relational Database Concepts:
    Telvents - RDBMS Concepts
    TutorialsPoint - RDBMS Concepts



  • @mrjj
    Good day!
    Yes, there is no multiple choice included. The user is required to type the output of the set of code that will be displayed.

    As of now, this is how I visualize the logic or the structure of the app (Please let me know if there are some weaknesses or if this will not gonna work or if there is a better way of doing it):

    1. The user will need to choose and click the button(topic name) which has the code that will declare the variable or an object(I don't know what should I use) and will store a data in it.
      Example: When the user click the If Statement then int Topic = 1 or string Topic = "IF";

    2. When the user click the Beginner button then int Dif_Lvl = 1 or string Dif_Lvl= "Beginner";

    3. When the user input the number and click Next button then int Number_Of_Questions = user_input;
      Print_Question(Topic, Dif_Lvl, Number_Of_Questions);
      The Print_Question function contains the query and a loop to display the next pages depending on the user topic/dif_lvl.

    Do I need objects and classes (not that familiar with that) or mostly I would use functions?

    0_1555948631684_414b12ee-58f3-411b-b62a-67e630a2173d-image.png

    Thanks :)



  • @KillerSmath
    Good day! Thank you for your response.
    As of now, I have not learned QML yet. I only know the basic of QT Widget Application and I also tried the Stack Widget in it. QML seems pretty daunting to me for now but I will consider peeking and see if I could work on it.

    Sadly I need to finish this app within 3 weeks from now or else I would not meet the deadline. I think I wouldn't be able to dig deep into things because that would eat up my time.


  • Lifetime Qt Champion

    @dvlpr.bernard said in Advice about the application I will be making? (I'm a beginner):

    Do I need objects and classes (not that familiar with that) or mostly I would use functions?

    You will be mostly used classes since all Widgets are classes.
    the Print_Question should be a member function to the MainWindow so
    it can access the widgets. You can use QLabel for the topic (call setText on it)
    and QPlainTextEdit for the user / answer input.
    The design looks fine. You can realize it with a stacked widget.

    for both the Topic and Level selection, you have 2 options.
    1: as soon as the user click button, its selected and page is changed.
    2: You set Checkable on the buttons, so they are like a checkbox ( can be selected) and
    first when user press next, the page is changed.



  • @mrjj
    Good day!

    Is it possible to store a long string in SQLite database or maybe an image? I need it for the questions or do I?

    0_1556191665411_732ce764-c6ca-43bb-9503-7d7f32a626a5-image.png


  • Lifetime Qt Champion

    Hi
    Storing text in Sqllite should just work. use the TEXT type for the column.

    Im not sure what you would need any images for ?



  • Okay, did you mean this string? I already tried it but it didn't work I think it is one liner meaning I can't put two or more line data.

    0_1556192247323_cb9def4a-6675-4b99-9615-d7151c9d178c-image.png

    I want store an image to make it look more a real code rather than just a plain text, but if it is not possible thats fine.
    0_1556192503849_c8f12403-d6c9-48af-bb84-37ba1b9cdfa5-image.png


  • Lifetime Qt Champion

    @dvlpr.bernard
    where you have string, if u open drop down, there is not TEXT type ?

    ahh. that way.
    well we can fix that later with a syntax highlighter
    https://doc.qt.io/qt-5/qtwidgets-richtext-syntaxhighlighter-example.html
    so when we set text texts its formatted with colors. no need to store image of it.



  • @mrjj
    Uhhmm I see, I need to use Text rather than string.
    Thank you, thank you!


  • Lifetime Qt Champion

    @dvlpr.bernard
    string is a way to optimize the db so one can set a fixed size so if all text is within that, its more efficient, however, for your case with 75 questions. just use TEXT type.



  • @mrjj
    Sir. Just wondering how can I access the string value from other functions? I want to use it in other functions.

    0_1556204335320_ff86f8e5-34df-453a-887c-a9a1f3df8d9f-image.png


  • Lifetime Qt Champion

    Hi
    what string do you mean ?
    The Topic column string from the data base ?



  • @mrjj Hello, no. I mean the QString ch_topic whenever the user chooses a topic. How I'm going to get the ch_topic in order to use it in other functions?


  • Lifetime Qt Champion

    @dvlpr.bernard
    Hi
    Just store in main window class.
    All the data you want to be shared between functions should be part of MainWindow. (in .h)
    At least stuff like selected Topic etc.



  • @mrjj
    Hello, Hmm didn't know why this is happening. What I did wrong?

    0_1556212301978_004fed1f-b35c-473b-ac23-46e096ec3041-image.png
    0_1556212325470_a4634d6a-f4a2-4b72-a254-2cd4b79ab393-image.png


  • Lifetime Qt Champion

    Hi
    You say get_ch_topic is of type MainWindow ???
    Should it not QString ?
    Or do you mean it should be a function to return
    the ch_topic ?
    In any case, type of MainWindow just seems wrong.



  • @mrjj
    I don't know. But I want to define a global object so that other functions can use it. But I just don't know where to declare it


  • Lifetime Qt Champion

    @dvlpr.bernard
    Hi
    Just like the
    QString ch_topic;
    Then all member functions have access to it as they are part of the class.



  • @mrjj
    whenever I use qDebug() <<get_ch_Topic.getTopic() in the same function where ch_topic was define it returns "IF". But when I use qDebug() <<get_ch_Topic.getTopic() in other functions it return "". I don't know why but maybe because the object name was different?

    0_1556213404603_c1fd677f-9d65-4757-823b-cd0ca12c8cd1-image.png

    0_1556213335075_393dae0b-1e06-4d26-b205-1442f8e031ab-image.png
    0_1556213772599_8a754c36-c9f0-4944-9321-6a467c0b3431-image.png
    0_1556213365670_97704c96-1c78-4e8d-a8f3-d6ed2356bc05-image.png


  • Lifetime Qt Champion

    Hi
    Do NOT make new instances of the main window class like you do
    alt text

    that is just plain wrong.

    You are already in an instance. So no need to ever make new ones.
    you can simply use the ch_topic variable.
    Its already declared in the MainWindow you are using already.



  • @mrjj
    Sir, that's what I did before but whenever I do that it says 0_1556214114582_f2ded59c-c3a3-4d57-aae1-428aaa89e276-image.png


Log in to reply
 

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