Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Passing user Input to Slots



  • Hey Everyone,

    I'm new to Qt and I find the Signal/Slot Concept in this Framework really helpful. I'm doing some GUI Programming and I'm trying to get some user Input and then do some actions with it. So I have some Qpush Buttons in my GUI when the User clicks one of them he is asked to insert a number or a String.

    How can I pass the Input to a Slot that works with it ?



  • @JohnSRV
    The slot for clicking the pushbutton does not itself do anything with/know about the number/string you are about to "ask for"; it hasn't happened yet! I trust you get that bit.

    When the user has clicked the button, how do you intend to "[ask user] to insert a number or a String"? How are you going to prompt for that? Only after that can we discuss how you might use signals/slots to forward the data input onto something else.


  • Lifetime Qt Champion

    Hi
    How do you then get this number or string?



  • @JonB after the User clicks the Button a Dialog Window pops up where the User can insert an IP Adress for example.

    void boxconec::Target_IP()
    {
    	QString TargetIP = QInputDialog::getText(this, "Choose Target system", "Enter the IP Address of the Target System:");
    	ui->IPAdress->setText(TargetIP);
    }
    

    So I want to pass this TargetIP Variable to a Function that connects to a QTcp Server listening under the given Address. How can I pass that information to my Client Function?


  • Lifetime Qt Champion

    @JohnSRV
    How does you client function look like ?
    can you just add the new parameter and call it

    void boxconec::Target_IP()
    {
    	QString TargetIP = QInputDialog::getText(this, "Choose Target system", "Enter the IP Address of the Target System:");
    	ui->IPAdress->setText(TargetIP);
    ClientFunction(TargetIP);
    }
    


  • @JohnSRV
    I will leave you in my colleague @mrjj's capable hands for guiding you now :)



  • @mrjj Hey thanks for your reply and sorry for my late Reply. My Client Function is not complete so I tried to test this with a Simple QFile.

    void BoxConnector::ProjectButtonPushed()
    {
    	QString ProjectPath_UserInput = QInputDialog::getText(this, "Project", "Enter the Path to the Project");
    	ui->Project_Path->setText(ProjectPath_UserInput);
    	QFile Project (Project_UserInput ); 
    	if (Project.exists())
    	{
    		QMessageBox msgBox; 
    		msgBox.setText("Opening the Project..");
    	}
    	else
    	{
    		QMessageBox ErrorBox; 
    		ErrorBox.setText("couldn't find the Project..");
    	}
    }
    

    I can't seem to get a Message box neither for "Opening the Project.." nor for "couldn't find with the Project". Does the User Input get passed correctly to the QFile with this Code??


  • Lifetime Qt Champion

    Hi
    You need to call msgBox.exec(); to have it show.
    Currently, you just set its text but dont tell it to show:=)
    https://doc.qt.io/qt-5/qmessagebox.html

    Also since you want the user to input the FULL path to a project what about using FileDialog instead so the user can browse to file and not have to type it all?

    https://doc.qt.io/qt-5/qfiledialog.html



  • @JohnSRV
    QMessageBox::setText() simply sets the text for the message box, it does not show it. You need to call QMessageBox::exec() to do that.



  • Thank you all for your help ! I solved my problem with the snippet from @mrjj

    void boxconec::Target_IP()
    {
    	QString TargetIP = QInputDialog::getText(this, "Choose Target system", "Enter the IP Address of the Target System:");
    	ui->IPAdress->setText(TargetIP);
    ClientFunction(TargetIP);
    }
    

    The Application will get more complicated where the ClientFunction returns a Value that has to be passed to another slot but I'm not there yet. As for now I'm gonna mark this question as solved.

    Thank you !



  • @JohnSRV
    What you have ended up with is fine. But be aware you have not encountered any signal/slot stuff in it. In effect, the signal/slot stuff is being hidden from you inside QInputDialog::getText(), and what you see at this level is a synchronous program.



  • Hello Everyone,

    I'm back on this topic now. I have a GUI where the User can choose which Project he wants to work with. When he pushes the Button "choose Project" a QFileDialog gets opened.

    void BoxConnector::ProjectButtonPushed()
    {
    QString ProjectPath_UserInput = QFileDialog::getOpenFileName(this, tr("Open Project"), "C:/Users/Project");
    

    Now I have many other buttons in my GUI where the user could manipulate the chosen project. How Can I pass the Path of the chosen Project to the other Slots?

    I for example have a Button where the User could insert a Simulation Step Size

    void BoxConnector::SimStepSizePushed()
    {
    	QString SimSize_UserInput = QInputDialog::getText(this, "Simulation Step Size", "Insert Simulation Step Size");
    }
    

    How Can I pass the Path of the chosen Project in the first Slot to this Slot for example so I could manipulate the Simulation Step Size of the chosen Project?


  • Lifetime Qt Champion

    Hi
    Just make
    QString ProjectPath_UserInput;
    a member of BoxConnector
    so all slots and methods has access.



  • @mrjj I declared a QString in the BoxConnector.h.

    Its Value gets set in the ProjectButtonPushed() Slot. When I call this String in another Slot it seems to be empty.


  • Lifetime Qt Champion

    @JohnSRV
    make sure you didnt do the classic error.
    you line should be be
    ProjectPath_UserInput = QFileDialog::getOpenFileName(this, tr("Open Project"), "C:/Users/Project");

    and NOT
    QString ProjectPath_UserInput = QFileDialog::getOpenFileName(this, tr("Open Project"), "C:/Users/Project");
    as then you still use local variable..



  • As a matter of fact I did make the classic Mistake. Thanks !!!


  • Lifetime Qt Champion

    @JohnSRV
    Thats is why its a classic, very easy to do :)


Log in to reply