Qt początki - funkcja getInteger()

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
sentrio
Piegowaty Guziec
Piegowaty Guziec
Posty: 24
Rejestracja: 05 gru 2009, 17:28
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Qt początki - funkcja getInteger()

Post autor: sentrio »

qt uczę się od wczoraj i oto mój problem - przycisk "podaj liczbę" nie wyświetla okna dialogowego do podania liczby. Oto kod.

Kod: Zaznacz cały

#include <QtGui/QApplication>
#include "my_window.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    My_Window w;
    w.show();
    return a.exec();
}

Kod: Zaznacz cały

#ifndef MY_WINDOW_H
#define MY_WINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QMessageBox>
namespace Ui {
    class My_Window;
}

class My_Window : public QMainWindow {
    Q_OBJECT
public:
    My_Window(QWidget *parent = 0);
    ~My_Window();

protected:
    void changeEvent(QEvent *e);
    void setInteger();

private:
    Ui::My_Window *ui;

    QPushButton *koniec;
    QPushButton *integerButton;
    QLabel *integerLabel;

};

#endif // MY_WINDOW_H

Kod: Zaznacz cały

#include "my_window.h"
#include "ui_my_window.h"
#include <QtGui>
My_Window::My_Window(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::My_Window)
{
    ui->setupUi(this);

    setGeometry(400,300,300,200);
    setWindowTitle("nauka");

    koniec=new QPushButton("wyjscie", this);
    koniec ->setGeometry(100,100,100,40);
    connect(koniec, SIGNAL(clicked()) ,qApp, SLOT(quit()) );

    integerLabel = new QLabel;
    integerButton = new QPushButton("podaj liczbe", this);
    integerButton -> setGeometry(100,60,100,40);
    connect(integerButton, SIGNAL(clicked()), qApp, SLOT(setInteger()));

}

My_Window::~My_Window()
{
    delete ui;
}


void My_Window::setInteger()
{
    bool ok;
    int i = QInputDialog::getInt(this, "QInputDialog",
                                 "Podaj liczbe:", 25, 0, 100, 1, &ok);
    if (ok)
        integerLabel -> setNum(i);
}



void My_Window::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}
Zależy mi przede wszystkim co, jak i dlaczego. Z góry dziękuję z pomoc.
skoczo
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 176
Rejestracja: 09 kwie 2008, 11:40
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Re: Qt początki - funkcja getInteger()

Post autor: skoczo »

Tutaj masz opis sygnałów i slotów http://doc.qt.nokia.com/latest/signalsandslots.html

Jeśli chodzi o błąd w programie, to tak na szybko wydaje mi się że cohdzi o to że funkcja "setInteger" powinna być w sekcji "public slot:" a nie "protected:"
sentrio
Piegowaty Guziec
Piegowaty Guziec
Posty: 24
Rejestracja: 05 gru 2009, 17:28
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Re: Qt początki - funkcja getInteger()

Post autor: sentrio »

niestety ale dalej nic. Jakieś pomysły?
Awatar użytkownika
DDAroo
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 107
Rejestracja: 27 cze 2009, 10:47
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Architektura: x86
Lokalizacja: Kraków
Kontakt:

Re: Qt początki - funkcja getInteger()

Post autor: DDAroo »

Jest:

Kod: Zaznacz cały

connect(integerButton, SIGNAL(clicked()), qApp, SLOT(setInteger()));
Powinno być:

Kod: Zaznacz cały

connect(integerButton, SIGNAL(clicked()), this, SLOT(setInteger()));
setInteger() znajduje się wewnątrz klasy My_Window, a nie qApp. Dodatkowo setInteger() powinno być slotem:

Kod: Zaznacz cały

protected:
    void changeEvent(QEvent *e);

protected slots:
    void setInteger();
sentrio
Piegowaty Guziec
Piegowaty Guziec
Posty: 24
Rejestracja: 05 gru 2009, 17:28
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Re: Qt początki - funkcja getInteger()

Post autor: sentrio »

dzięki DDARoo, teraz działa ale postanowiłem jeszcze na początek zrobić obsługę wybierania dowolnego pliku ale teraz program się kompiluje ale jak otwieram jakiś plik w oknie to program się sypie. Ogólnie chcę mieć w zmiennej openFileNameLabel string ze scieżką tego pliku.

dodaje kod

Kod: Zaznacz cały

#include <QtGui/QApplication>
#include "my_window.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    My_Window w;
    w.show();
    return a.exec();
}

Kod: Zaznacz cały

#include "my_window.h"
#include "ui_my_window.h"
#include <QtGui>
#include <iostream>
#include <QFileDialog>
My_Window::My_Window(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::My_Window)
{
    ui->setupUi(this);

    setGeometry(400,300,300,200);
    setWindowTitle("nauka");

    koniec=new QPushButton("wyjscie", this);
    koniec ->setGeometry(100,100,100,40);
    connect(koniec, SIGNAL(clicked()) ,qApp, SLOT(quit()) );

    integerLabel = new QLabel;
    integerButton = new QPushButton("podaj liczbe", this);
    integerButton -> setGeometry(100,60,100,40);
    connect(integerButton, SIGNAL(clicked()), this, SLOT(setInteger()));

    wiadomosc=new QPushButton ("komunikat", this);
    wiadomosc -> setGeometry(100,20,100,40);
    connect(wiadomosc, SIGNAL(clicked() ),this, SLOT(komunikat()) );

    plik= new QPushButton("plik", this);
    plik -> setGeometry(100,140,100,40);
    connect(plik, SIGNAL(clicked()), this, SLOT(setOpenFileName() ) );
}

My_Window::~My_Window()
{
    delete ui;
}

void My_Window::setOpenFileName()
{
    QString fileName = QFileDialog::getOpenFileName(this);
    if (!fileName.isEmpty())
    {
        openFileNameLabel->setText(fileName);
    }
}

void My_Window::komunikat()
{
    QMessageBox::about(this,"o programie","informacje");
}



void My_Window::setInteger()
 {
    bool ok;
    int i = QInputDialog::getInt(this, tr("QInputDialog::getInteger()"),
                                 tr("Percentage:"), 25, 0, 100, 1, &ok);
    if (ok)
        integerLabel->setText(tr("%1%").arg(i));
 }



void My_Window::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

Kod: Zaznacz cały

#ifndef MY_WINDOW_H
#define MY_WINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QMessageBox>
#include <QCheckBox>
namespace Ui {
    class My_Window;
}

class My_Window : public QMainWindow {
    Q_OBJECT
public:
    My_Window(QWidget *parent = 0);
    ~My_Window();
protected:
    void changeEvent(QEvent *e);

protected slots:
    void setInteger();
    void komunikat();
    void setOpenFileName();

private:
    Ui::My_Window *ui;

    QPushButton *koniec;
    QPushButton *integerButton;
    QLabel *integerLabel;
    QLabel *sciezka;
    QPushButton *wiadomosc;
    QPushButton *plik;
    QLabel *openFileNameLabel;

};

#endif // MY_WINDOW_H
ps w gotowych żródłach widzę taką definicję funkcji do otwiernia plików ale nie rozumiem skąd się wzieło to "tr".

Kod: Zaznacz cały

 void Dialog::setOpenFileName()
 {
     QFileDialog::Options options;
     if (!native->isChecked())
         options |= QFileDialog::DontUseNativeDialog;
     QString selectedFilter;
     QString fileName = QFileDialog::getOpenFileName(this,
                                 tr("QFileDialog::getOpenFileName()"),
                                 openFileNameLabel->text(),
                                 tr("All Files (*);;Text Files (*.txt)"),
                                 &selectedFilter,
                                 options);
     if (!fileName.isEmpty())
         openFileNameLabel->setText(fileName);
 }
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Re: Qt początki - funkcja getInteger()

Post autor: beluosus »

sentrio pisze:qt uczę się od wczoraj i oto mój problem
Jedynym rozwiązaniem tego problemu jest pouczyć się dłużej i nie bać się zaglądać do dokumentacji.
sentrio pisze:nie rozumiem skąd się wzieło to "tr".
Programista wpisał. Jeśli nie zamierzasz tłumaczyć swojego programu na inne języki to nie musisz tego używać.

Przechodząc do tego co Cię najbardziej interesuje, bo i tak pewnie zignorujesz pierwszą radę: nie masz stworzonego obiektu openFileNameLabel...
sentrio
Piegowaty Guziec
Piegowaty Guziec
Posty: 24
Rejestracja: 05 gru 2009, 17:28
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Re: Qt początki - funkcja getInteger()

Post autor: sentrio »

napisałem sobie już program i działa. Załapałem już te dialogi , sygnały i tajemniczą funkcję tr(). Wszystko jest ok ale nie mogę poukładać widgetów na layoucie. daje kod by najpierw poukladać buttony

Kod: Zaznacz cały

#include <QtGui/QApplication>
#include "my_window.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    My_Window w;
    w.show();
    return a.exec();
}

Kod: Zaznacz cały

#ifndef MY_WINDOW_H
#define MY_WINDOW_H

#include <QMainWindow>
#include <QTextEdit>
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>
namespace Ui {
    class My_Window;
}

class My_Window : public QMainWindow {
    Q_OBJECT
public:
    My_Window(QWidget *parent = 0);
    ~My_Window();

protected:
    void changeEvent(QEvent *e);

private:
    Ui::My_Window *ui;
    QVBoxLayout *uklad;
    QPushButton *wyjscie;
    QPushButton *dzialanie;
    QPushButton *podaj_liczbe;

};

#endif // MY_WINDOW_H

Kod: Zaznacz cały

#include "my_window.h"
#include "ui_my_window.h"

My_Window::My_Window(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::My_Window)
{
    ui->setupUi(this);
    setWindowTitle("lalala");
    setGeometry(400,300,300,200);

    uklad = new QVBoxLayout;
    setLayout(uklad);

    wyjscie=new QPushButton("wyjscie", this);
    dzialanie=new QPushButton("dzialanie",this);
    podaj_liczbe=new QPushButton("podaj liczbe", this);

    uklad -> addWidget(dzialanie);
    uklad -> addWidget(podaj_liczbe);
    uklad -> addWidget(wyjscie);
}

My_Window::~My_Window()
{
    delete ui;
}

void My_Window::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}
wszystko się kompiluje, są utworzone przyciski ale pojawia się tylko jeden (może nakrywają się - sam już nie wiem)
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Re: Qt początki - funkcja getInteger()

Post autor: beluosus »

Robisz podstawowy - może nie tyle błąd co nietakt - o którym zapomniałem wspomnieć poprzednio. Otóż tworzysz GUI za pomocą klikanego edytora, a widgety tworzysz dynamicznie. Zazwyczaj (prawie) wszystko tworzy się edytorem formularzy, albo wszystko tworzy się kodem. Ty mieszasz te techniki i wychodzi co wychodzi. Prawdopodobnie w Twoim okienku jest już jakiś layout i dlatego nie ustawia się kolejny, domyślnie istnieje taki obiekt jak "centralWidget" i na nim musiałbyś ustawić layout:

Kod: Zaznacz cały

ui->centralWidget->setLayout(uklad);
Polecam tworzyć program bez edytora formularzy (wszystko tworzyć kodem), bo i tak większość robisz w ten sposób. Proponuję przejrzeć ten tutorial: http://doc.qt.nokia.com/4.7/widgets-tutorial.html
Są to 4 krótkie tematy, które powinny ugruntować Twoją wiedzę. Po ich przeczytaniu zrozumiesz o czym piszę.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 12 gości