Qt - I want to use the QComboBox after the return/enter is pressed.
-
I have the following problem:
I'm using the QComboBox of QT to select a path by a Drop & Down. It is working fine after I choose one of the list, the path is automatically update. But now if I want to edit the Path manually by type in a path, I get immediately a warning. So I know that this is happening cause of the argument:
connect(ui.leftBox, &QComboBox::currentTextChanged, this, &MainCom::updatepath);
So always if I'm going to change the path, for example by changing only one letter or select it by Drop & Down the "currentTextChanged" calls the function 'updatepath'
So what I want to achieve is that if I'm going to select a path the function should be called normally. But if I'm going to type in a new path or editing the path manually I want that the function will be called after type "return".I hope you can help.
-
@developer_96
TryQComboBox::editTextChanged
instead. If that behaves the same, I guess you'll need to pick upQLineEdit *QComboBox::lineEdit()
and slot ontoQLineEdit::editingFinished()
for that. -
@JonB i can not use the QLineEdit in my connect.
-
@developer_96 said in Qt - I want to use the QComboBox after the return/enter is pressed.:
i can not use the QLineEdit in my connect.
Why not? you can get the pointer to line edit from your combo box using QLineEdit *QComboBox::lineEdit() as @JonB pointed out.
-
@jsulm don't know. I tried to use
QLineEdit::editingFinished()
in my connect function like:
connect(ui.leftBox, &QLineEdit::editingFinished, this, &MainCom::updatepath);
but it does not work.
-
hi
should that not be
connect(ui.leftBox->lineEdit(), &QLineEdit::editingFinished, this, &MainCom::updatepath); -
@developer_96 said in Qt - I want to use the QComboBox after the return/enter is pressed.:
but it does not work
As mentioned already: you need to get the pointer to the line edit using QLineEdit *QComboBox::lineEdit() and use that pointer in the connect.
-
I guess you'll need to pick up
QLineEdit *QComboBox::lineEdit()
and slot ontoQLineEdit::editingFinished()
for that. -
@developer_96
You have aQComboBox
. I gave you the method you need to access itsQLineEdit
.connect()
the line edit'sQLineEdit::editingFinished
signal to the desired slot. -
@JonB i try to acces it by using
connect(ui.leftBox, &QLineEdit::editingFinished, this, &MainCom::updatepath);
and
connect(ui.leftBox->lineEdit(), &QLineEdit::editingFinished, this, &MainCom::updatepath);
but it does not work.
Thank you for the help. -
@developer_96
The first one will generate a compiler-time error.The second one is correct. What "does not work"? have you tried putting a
qDebug()
in your&MainCom::updatepath()
method, does it get hit? -
@JonB it says "An incomplete type is not allowed" for &QLineEdit::editingFinished.
-
@developer_96
Put#include <QLineEdit>
at the head of your source (.cpp
) file. -
@JonB thank you. yeah i know but i removed it cause i get this problem after i put in and try to debug:
-
@developer_96 Please show the relevant code.
Does your updatepath() slot have any parameters? -
@jsulm
Connect:connect(ui.leftBox->lineEdit(), &QLineEdit::editingFinished, this, &MainCom::updatepath);
Updaatepath:
void MainCom::updatepath(const QString& path)
-
And where do you expect does
const QString& path
should come from when the signal does not have a parameter? -
@developer_96 said in Qt - I want to use the QComboBox after the return/enter is pressed.:
QLineEdit::editingFinished
Has no parameter, so you can't connect it with a slot which expects a parameter. That's exactly what the first error message is saying.
-
@developer_96
One/the best way of doing what you want --- pass your own extra parameter to slot --- is to learn to use C++ lambdas here:connect(ui.leftBox->lineEdit(), &QLineEdit::editingFinished, this, [this]() { this->updatepath(this->ui.leftBox->lineEdit()->text()); }); // or next line does exactly the same thing, depends which you find clearer connect(ui.leftBox->lineEdit(), &QLineEdit::editingFinished, this, [this]() { updatepath(ui.leftBox->lineEdit()->text()); });