Vinnaren i pepparkakshustävlingen!
2022-05-03, 20:34
  #1
Medlem
Programmet ska exekvera funktionen test() när QPushButton är clicked().

Varför exekverar inte test() när knappen är tryckt?
QObject::connect(button, SIGNAL(clicked()), &app, SLOT(test()));

Kod:
#include <QApplication>
#include <QPushButton>
#include<iostream>

using namespace std;

void test(){
        int row = 0;
        int column = 0;

        for (row = 0; row < 4; row++) {
            for (column = 0; column < 8; column++) {
                cout << "* ";
                cout << " ";
            }
            column = 0;
            cout << endl;
            for (column = 0; column < 8; column++) {
                cout << " ";
                cout << "* ";
            }
            column = 0;
            cout << endl;
        }
}

int main(int argc, char **argv)
{
 QApplication app (argc, argv);

  QPushButton *button = new QPushButton("OK");

  QObject::connect(button, SIGNAL(clicked()), &app, SLOT(test()));
  button->show();

  return app.exec();
}
Citera
2022-05-08, 02:27
  #2
Medlem
SIGNAL() och SLOT() är två makros som man inte bör använda längre enligt denna artikelpost här:

https://stackoverflow.com/questions/...m-button-in-qt

Citat:
connect(this, SIGNAL(clicked()), SLOT(this->onClick())); - Please stop using the old macro / string based signal/slot syntax. Use the new pointer-to-member-function based syntax instead. The new way is compile-time checked rather than run-time checked, is faster and you can connect to anything (so you don't need to mark functions as slots any more). Forget about SIGNAL() and SLOT() already.
Makron skippar nämligen alltid parameterkontrollen och typkontrollen vid kompilering och efterföljande runtime körning - och kan därför ge mycket oväntade resultat.
Du förefaller att använda för gamla och föråldrade testexempel.
Och försök leta efter lite nyare.

En nackdel med att använda funktioner som parametrar i ett annat funktionsanrop är att parameterfunktionen måste följa en viss fast template (= mall).
Viktigt brukar vara att hålla reda på om test() ska stå så här;

void test();
eller
bool test();
eller tex
int test();

Buttonclick funktioner brukar vara bool, men i äldre kodkokböcker kan de vara int
istället. Det finns också tex de fördefinierade värdena typ
BUTTON_DOUBLECLICK, BUTTON_DOWN och BUTTON_UP i många grafiska bibliotek.

Man måste i en del applikationer också bestämma från programmets start om
knappen ska vara uppe eller nere från början.

För övrigt vet jag inte vad du vill åstadkomma med din kod.
Den ser ofullständig ut.
Så om du kunde utveckla lite mera vad som avses så är det säkert någon annan här som
kan utveckla tråden bättre.
Själv är jag rätt dålig på vissa sådana här grafiska bibliotek.
Men det finns ju en del matnyttigt på Qts hemsida här:
https://doc.qt.io/qt-5/overviews-main.html

Bara att Googla och leta efter bra tutorials där och på flera andra sajter.
Kolla också datumstämpeln så att du ser att du inte hittar gammal skåpmat
som inte duger för dagens kokböcker för Qt-kod.
När man söker på Linux-relaterade sidor så kan man också råka hitta hopplöst föråldrade
tricks som knappast används idag.

Det kan ge oönskade sidoeffekter på det viset att ett jobb med lite kodning i kan ta flera timmar
av onödigt letande. Och arbetstid är dyrbart idag.

NB: I äldre C-kod, så är SIGNAL vanligtvis lowercase signal som menas,
och är en interrupthanterare som startar ett viss funktion när en signal,
tex SIG_INT sänds till din app eller ditt program.
Den typen av kod skrevs på den gamla goda DOS 6.22-tiden.
Idag är den föråldrad men finns fortfarande kvar i tex drivers och systemkritiska processer.
I de flesta OS alltså...
Citera
2022-05-08, 13:09
  #3
Medlem
Citat:
Ursprungligen postat av NegerStryparen
NB: I äldre C-kod, så är SIGNAL vanligtvis lowercase signal som menas,
och är en interrupthanterare som startar ett viss funktion när en signal,
tex SIG_INT sänds till din app eller ditt program.
Den typen av kod skrevs på den gamla goda DOS 6.22-tiden.
Idag är den föråldrad men finns fortfarande kvar i tex drivers och systemkritiska processer.
I de flesta OS alltså...

Ursäktar att citerar mig själv här.
Såg fel, ursäktar att jag skrev fel, signalen heter SIGINT, och inte SIG_INT.
Det finns också tex SIGTERM och SIGKILL. Signalen SIGKILL dödar processen helt.
Fortfarande kan man skriva kod som använder interrupthanterare, och det har man i drivers
och systemkritiska processer även i dagens miljöer.
Att skriva kod med interrupthanterare är en liite udda syssla,
och koden ser väl inte helt självklar ut för den ovana.
__________________
Senast redigerad av NegerStryparen 2022-05-08 kl. 13:12.
Citera
2022-05-08, 14:55
  #4
Medlem
liqueurs avatar
det korta svaret är ändra till nedan så borde din kod fungera,
Kod:
QObject::connect(button, &QPushButton::clicked, &app, test);

Det längre svaret är som NegerStryparen säger så använder du det "gamla" sättet att använda connect, vilket inte alltid är fel,
men just i ditt fall så refererar du till en slot som du inte definierat, detta kan inte hända med det nya sättet då denna använder c++ typsystem som hade genererat ett kompileringsfel.
Citera
2022-05-08, 17:17
  #5
Medlem
Citat:
Ursprungligen postat av liqueur
det korta svaret är ändra till nedan så borde din kod fungera,
Kod:
QObject::connect(button, &QPushButton::clicked, &app, test);

Det längre svaret är som NegerStryparen säger så använder du det "gamla" sättet att använda connect, vilket inte alltid är fel,
men just i ditt fall så refererar du till en slot som du inte definierat, detta kan inte hända med det nya sättet då denna använder c++ typsystem som hade genererat ett kompileringsfel.

Mycket tack för påpekandet, det är just så man bör använda medlemsfunktionen connect. Och undvika makrona SIGNAL(...) och SLOT(...). Det är fördelen med C++ kompilering att den kollar att typen och anropen görs på rätt sätt.
Använder man däremot makron så sker ingen typkontroll varken vid kompilering eller under runtime.
Återigen tack för idén.
Viktigt att TS letar efter moderna exempel som inte är för gamla och som gällde för den äldre standarden.
Det blir då lätt att blanda ihop olika versioner.

Äldre C++ kod för Windows basics fönsterhantering mm, hade också ett stort antal fördefinierade makros som kunde ställa till bekymmer vid tex kompilering och i runtime. Och vem minns väl inte kanske 16 bit Windows där segmenterad minnesarkitektur segmentffset gällde ? Och att man fick använda "magiska makron" för att kunna konvertera adresserna
Citera
2022-05-08, 20:05
  #6
Medlem
OK enligt den dokumentation som finns i Qt verkar globals fortfarande vara högst aktuell.

om.. man vill låta användare skriva in ett värde i QLineEdit och låta värdet påverka stepUp() funktionen som är kopplad till en QpushButton, hur gör man det i DesignEditMode?
__________________
Senast redigerad av bosscs2 2022-05-08 kl. 20:10.
Citera
2022-05-12, 19:50
  #7
Medlem
Samma undring men bättre fråga: Om man vill skriva ett värde i exempelvis en QSpinBox (som är skapad i design mode) genom att skriva källkod, hur kommer man då åt objektet? Den finns inte synlig i källkoden om den blivit skapad i design mode.
Citera
2022-05-12, 20:45
  #8
Medlem
liqueurs avatar
oftast brukar du ha tillgång till alla objekt som du lägger till i "design mode" via medlemsvariabeln ui, men detta är såklart lite olika beroende på hur man lägger upp projektet, men jag har iallafall för mig att detta är standard Qt Designer.

Kod:
#include "mainwindow.h"
#include "./ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : 
QMainWindow(parent)
    , 
ui(new Ui::MainWindow)
{
    
ui->setupUi(this);

    
//denna rad sätter värdet till 98 i din spinbox.
    
ui->spinBox->setValue(98);


Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in