Anropa andra klassers funktioner med argument inom C++ QT?
Låt oss säga att vi har en funktion inom C++ QT som heter
void Main_window::on_actionInput_calibration_triggered(){
main_terminal_append_status_row("Input calibration menu button pressed");
input_calibration = new Input_calibration();
input_calibration->show();
}
När on_actionInput_calibration_triggered() anropas så öppnas ett nytt fönster upp.
I klassen Input_calibration som ser ut så här
Input_calibration::Input_calibration(QWidget *parent) : QWidget(parent), ui(new Ui::Input_calibration) {
ui->setupUi(this);
}
Input_calibration::~Input_calibration(){
delete ui;
}
void Input_calibration::on_refrensh_calibrations_pushButton_clicked(){
}
Då finns det en funktion vid namn on_refrensh_calibrations_pushButton_clicked() som är kopplad till en knapp på mitt grafiska gränssnitt.
Målet med detta är att öva på att ha kommunikation mellan olika klasser inom C++ QT. Det jag vill göra är att när jag trycker på knappen så anropas on_refrensh_calibrations_pushButton_clicked() och då vill jag att denna funktion ska köras.
void Main_window::main_terminal_append_status_row(const QString& status){
QString line = dateTime.currentDateTime().toLocalTime().toString() + " : " + status;
if(collected_status_text_line_in_main_terminal.length() > MAX_ROWS_IN_MAIN_TERMINAL){
collected_status_text_line_in_main_terminal.removeFirst();
collected_status_text_line_in_main_terminal.append(line);
ui->main_terminal_textEdit->clear();
foreach(QString str, collected_status_text_line_in_main_terminal)
ui->main_terminal_textEdit->append(str);
}else{
ui->main_terminal_textEdit->append(line);
collected_status_text_line_in_main_terminal.append(line);
}
}
Det finns flera sätt att göra detta. Antingen så använder jag nyckelordet this som argument. Se pil <----
void Main_window::on_actionInput_calibration_triggered(){
main_terminal_append_status_row("Input calibration menu button pressed");
input_calibration = new Input_calibration(this); <----
input_calibration->show();
}
Och sedan så anropar jag main_terminal_append_status_row(const QString& status) från funktionen on_refrensh_calibrations_pushButton_clicked().
Men detta är liksom standard C++ metodik. Att använda objekt i klasser som argument i konstruktörer kan vara rätt bökigt om det grenar sig allt för djupt. Nu kör jag QT ramverket och tanken är att man ska använda något som heter connect inom QT, vilket sägs ska göra livet enklare.
Jag har använt connect förut och det är bra. Men det var vid unika fall med färdiga klasser och färdiga exempel. Nu vill jag använda connect för att enkelt kunna anropa andra klassers funktioner med argument. Hur kan jag göra det?
Förslag:
Tycker ni att jag borde sätta en signal så här
class Input_calibration : public QWidget {
Q_OBJECT
public:
explicit Input_calibration(QWidget *parent = nullptr);
~Input_calibration();
signals:
void main_terminal_append_status_row(const QString& status);
Där jag anropar main_terminal_append_status_row med koden
emit main_terminal_append_status_row("Refresh calibration button pressed");
och jag ansluter klasserna med
input_calibration = new Input_calibration();
input_calibration->show();
connect(input_calibration, &Input_calibration::main_terminal_append_status_row, this, &Main_window::main_terminal_append_status_row);
Vad tycker ni?