2022-05-03, 20:34
  #1
Medlem
Programmet ska exekvera funktionen test() nr QPushButton r clicked().

Varfr exekverar inte test() nr 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 br anvnda lngre enligt denna artikelpost hr:

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 nmligen alltid parameterkontrollen och typkontrollen vid kompilering och efterfljande runtime krning - och kan drfr ge mycket ovntade resultat.
Du frefaller att anvnda fr gamla och frldrade testexempel.
Och frsk leta efter lite nyare.

En nackdel med att anvnda funktioner som parametrar i ett annat funktionsanrop r att parameterfunktionen mste flja en viss fast template (= mall).
Viktigt brukar vara att hlla reda p om test() ska st s hr;

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

Buttonclick funktioner brukar vara bool, men i ldre kodkokbcker kan de vara int
istllet. Det finns ocks tex de frdefinierade vrdena typ
BUTTON_DOUBLECLICK, BUTTON_DOWN och BUTTON_UP i mnga grafiska bibliotek.

Man mste i en del applikationer ocks bestmma frn programmets start om
knappen ska vara uppe eller nere frn brjan.

Fr vrigt vet jag inte vad du vill stadkomma med din kod.
Den ser ofullstndig ut.
S om du kunde utveckla lite mera vad som avses s r det skert ngon annan hr som
kan utveckla trden bttre.
Sjlv r jag rtt dlig p vissa sdana hr grafiska bibliotek.
Men det finns ju en del matnyttigt p Qts hemsida hr:
https://doc.qt.io/qt-5/overviews-main.html

Bara att Googla och leta efter bra tutorials dr och p flera andra sajter.
Kolla ocks datumstmpeln s att du ser att du inte hittar gammal skpmat
som inte duger fr dagens kokbcker fr Qt-kod.
Nr man sker p Linux-relaterade sidor s kan man ocks rka hitta hopplst frldrade
tricks som knappast anvnds idag.

Det kan ge onskade sidoeffekter p det viset att ett jobb med lite kodning i kan ta flera timmar
av ondigt 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 nr en signal,
tex SIG_INT snds till din app eller ditt program.
Den typen av kod skrevs p den gamla goda DOS 6.22-tiden.
Idag r den frldrad 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 nr en signal,
tex SIG_INT snds till din app eller ditt program.
Den typen av kod skrevs p den gamla goda DOS 6.22-tiden.
Idag r den frldrad men finns fortfarande kvar i tex drivers och systemkritiska processer.
I de flesta OS allts...

Ursktar att citerar mig sjlv hr.
Sg fel, ursktar att jag skrev fel, signalen heter SIGINT, och inte SIG_INT.
Det finns ocks tex SIGTERM och SIGKILL. Signalen SIGKILL ddar processen helt.
Fortfarande kan man skriva kod som anvnder interrupthanterare, och det har man i drivers
och systemkritiska processer ven i dagens miljer.
Att skriva kod med interrupthanterare r en liite udda syssla,
och koden ser vl inte helt sjlvklar ut fr 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 lngre svaret r som NegerStryparen sger s anvnder du det "gamla" sttet att anvnda connect, vilket inte alltid r fel,
men just i ditt fall s refererar du till en slot som du inte definierat, detta kan inte hnda med det nya sttet d denna anvnder 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 lngre svaret r som NegerStryparen sger s anvnder du det "gamla" sttet att anvnda connect, vilket inte alltid r fel,
men just i ditt fall s refererar du till en slot som du inte definierat, detta kan inte hnda med det nya sttet d denna anvnder c++ typsystem som hade genererat ett kompileringsfel.

Mycket tack fr ppekandet, det r just s man br anvnda medlemsfunktionen connect. Och undvika makrona SIGNAL(...) och SLOT(...). Det r frdelen med C++ kompilering att den kollar att typen och anropen grs p rtt stt.
Anvnder man dremot makron s sker ingen typkontroll varken vid kompilering eller under runtime.
terigen tack fr idn.
Viktigt att TS letar efter moderna exempel som inte r fr gamla och som gllde fr den ldre standarden.
Det blir d ltt att blanda ihop olika versioner.

ldre C++ kod fr Windows basics fnsterhantering mm, hade ocks ett stort antal frdefinierade makros som kunde stlla till bekymmer vid tex kompilering och i runtime. Och vem minns vl inte kanske 16 bit Windows dr segmenterad minnesarkitektur segmentffset gllde ? Och att man fick anvnda "magiska makron" fr att kunna konvertera adresserna
Citera
2022-05-08, 20:05
  #6
Medlem
OK enligt den dokumentation som finns i Qt verkar globals fortfarande vara hgst aktuell.

om.. man vill lta anvndare skriva in ett vrde i QLineEdit och lta vrdet pverka stepUp() funktionen som r kopplad till en QpushButton, hur gr 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 bttre frga: Om man vill skriva ett vrde i exempelvis en QSpinBox (som r skapad i design mode) genom att skriva kllkod, hur kommer man d t objektet? Den finns inte synlig i kllkoden om den blivit skapad i design mode.
Citera
2022-05-12, 20:45
  #8
Medlem
liqueurs avatar
oftast brukar du ha tillgng till alla objekt som du lgger till i "design mode" via medlemsvariabeln ui, men detta r sklart lite olika beroende p hur man lgger upp projektet, men jag har iallafall fr 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 stter vrdet 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