QObject Class Reference/pl

From Qt Wiki
Jump to navigation Jump to search
This article may require cleanup to meet the Qt Wiki's quality standards. Reason: Auto-imported from ExpressionEngine.
Please improve this article if you can. Remove the {{cleanup}} tag and add this page to Updated pages list after it's clean.

p. Tłumaczenie z angielskiego wykonał Andrzej Kryński (akrynski_AT_wp.pl )

Klasa QObject jest bazową klasą wszystkich obiektów Qt WŁAŚCIWOŚCI:

 objectName: QString<code>
'''FUNKCJE PUBLICZNE:'''

QObject(QObject* parent=0) — konstruktor virtual ~QObject() — destruktor

bool blockSignals(bool block)

bool QObject::blockSignals(bool block); Jeśli parametr block jest prawdziwy to sygnały emitowane przez ten obiekt są blokowane (znaczy to, że wyemitowanie jakiego kolwiek sygnału nie wywoła żadnej czynności powiązanej z tym sygnałem). Fałszywa wartość block powoduje, że żadne blokowanie nie nastąpi. Metoda zwraca ostatnio ustawioną wartość parametru block.

Należy zauważyć, iż sygnał destroyed() zostanie wyemitowany pomimo blokowania pozostałych sygnałów tego obiektu.

const QObjectList& children() const

const QObjectList & QObject::children () const Zwraca listę obiektów potomnych. Klasa QObjectList jest zdefiniowana w pliku nagłówkowym <QObject> następująco: typedef QList<QObject*> QObjectList; Pierwszy potomek dodawany to pierwszy obiekt na liście, a potomek dodany jako ostatni to ostatni obiekt na liście. Znaczy to, że nowe potomki dodawane są do końcówki listy. Należy zwrócić uwagę, że porządek listy ulega zmianie jeśli potomki QWidget są przesuwane w górę lub w dół przy użyciu void QWidget::raise() [slot] albo void QWidget::lower() [slot].

Widżet przesunięty w góre (raised()) staje się ostatnim obiektem na liście a przesunięty w dół – pierwszym.

bool connect ( const QObject * sender, const char * signal, const char * method, Qt::ConnectionType type = Qt::AutoConnection ) const

bool QObject::connect ( const QObject * sender, const char * signal, const char * method, Qt::ConnectionType type = Qt::AutoConnection ) const Jest to metoda przeciążająca funkcję connect(). Wiąże sygnał od obiektu sender z daną metodą obiektu. Jest równoznaczna z connect(sender, signal, this, method, type)

Każde wykonane połączenie emituje sygnał, tak więc zduplikowane połączenia emitują dwa sygnały. Połączenie można przerwać używając disconnect().

bool disconnect(const char* signal=0, const Qobject* receiver=0, const char* method=0)

bool Qobject::disconnect(const char* signal = 0, consc Qobject* receiver = 0, const char* method = 0) Ta funkcja przeciąża disconnect(). Odłącza sygnał od metody odbiorcy (slotu). Połączenie sygnał-slot jest usuwane gdy którykolwiek z aktywnych w połączeniu obiektów jest niszczony.

Funkcja jest bezpieczna dla wątku (thread-safe)

bool disconnect(const char* receiver, const char* method=0)

bool Qobject::disconnect(const Qobject* receiver, const char* method = 0) Kolejne przeciążenie metody disconnect() odłączające wszystkie sygnały z tego obiektu od metod odbiorcy.

Połączenie sygnał-slot jest usuwane, gdy który kolwiek z aktywnych w połączeniu obiektów jest niszczony.

void dumpObjectInfo()

void Qobject::dumpObjectInfo() Zwraca na wyjście debugera informację o połączeniach sygnału itp. dla danego obiektu.

Funkcja jest użyteczna do celów odpluskwiania ale nie wykonuje żadnych czynności ( jest nieaktywna) podczas kompilacji w trybie finalnym (release mode)

void dumpObjectTree()

void Qobject:: dumpObjectTree() Zwraca drzewo potomków danego obiektu, kierując je na wyjścia debugera (pokazuje w konsoli, zapisuje do pliku itp.).

Jak powyższa, jest aktywna tylko w trybie odpluskwiania.

Qlist<QByteArray> dynamicPropertyNames() const

Qlist<QByteArray> Qobject::dynamic propertyNames () const

Zwraca nazwy wszystkich właściwości, które były dodane do obiektu dynamicznie z użyciem setProperty().

virtual bool event(QEvent* e)

bool Qobject::event(QEvent* e) [virtual] Ta wirtualna metoda odbiera zdarzenia dla obiektu i powina zwracać prawdę jeśli zdarzenie e zostanie rozpoznane i obsłużone.

Funkcja event() może być nadpisana w celu odpowiedniego dostosowania zachowania obiektu.

virtual bool eventFilter(QObiect* watched, QEvent* event)

bool Qobject::eventFilter(QObject* watched, QEvent* event) [virtual] Filtruje wydarzenia, jeśli obiekt został zainstalowany jako filtr zdarzeń dla obserwowanych obiektów. Nadpisując tę metodę, jeśli chcemy odfiltrować zdarzenie, np. zatrzymać je do późniejszej obsługi, zwraca prawdę; w innym przypadku fałsz. Przykład: class MainWindow : public QmainWindow { public:

MainWindow();

protected:

bool eventFilter(QObject *obj, QEvent *ev);

private:

QtextEdit *textEdit;

}; MainWindow::MainWindow() {

textEdit = new QTextEdit;
setCentralWidget(textEdit);
textEdit->installEventFilter(this);

} bool MainWindow::eventFilter(QObject *obj, QEvent *event) {

if(objtextEdit){
 if(event->type()QEvent::KeyPress){
QKeyEvent keyEvent = static_cast<QKeyEvent>(event);

qDebug()<<"Ate key press"<<keyEvent->key();

return true;

} else {

return false;
}
} else{
//przekaż zdarzenie do klasy rodzica
return QMainWindow::eventFilter(obj,event);
}

}

Zauważ, że w powyższym przykładzie nieobsłużone zdarzenia przekazywane są

do metody eventFilter() klasy bazowej, gdyż może się zdarzyć, iż może ona nadpisywać eventFilter() dla swych wewnętrznych celów.

Ostrzeżenie: jeśli usuniesz obiekt odbiornika w tej funkcji upewnij się, by zwrócić prawdę. W innym przypadku Qt przekaże zdarzenie do usuniętego obiektu i program może się załamać.

T findChild (const Qstring& name=QString()) const

T QObject::findChild(const QString& name = QString()) const Zwraca potomka danego obiektu, który może być rzutowany na typ T i który występuje pod nazwą name, albo 0 jeśli taki obiekt nie istnieje. Opuszczenie argumentu name skutkuje dopasowaniem wszystkich nazw obiektu. Wyszukiwanie dokonuje się rekursywnie. Jeśli w kryteriach wyszukiwania mieści się więcej niż jeden obiekt potomny to zwracany jest najbardziej bezpośredni (najbliższy) wstępny. Nie jest zdefiniowane, jeśli istnieje wielu bezpośrednich wstępnych, który z nich zostanie zwrócony. W takim przypadku należy użyć metody findChildren(). Poniższy przykład zwraca potomka typu QPushButton rodzica parentWindow o nazwie

„button1":
QPushButton button = parentWidget->findChild<QPushButton>(„button1");

Kolejny przykład zwraca QListWidget – potomka parentWIdget:

QListWidget list = parentWidget->findChild<QListWidget>();

Uwaga: Funkcja nie jest dostępna w MSVC 6. W zastępstwie należy użyć qFindChild() jeśli jest konieczność użycia tego kompilatora.

QList<T> findChildren(const QString& name=QString()) const

QList<T> QObject::findChildren(const QString & name = QString()) const Zwraca wszystkie potomki danego obiektu o nazwie name, które mogą być rzutowane na typ T albo 0 jeśli takie obiekty nie występują. Ominięcie argumentu name skutkuje dopasowaniem nazw wszystkich obiektów. Wyszukiwanie przebiega rekursywnie. Następujący przykład pokazuje jak wyszukać listę potomnych obiektów typu QWidget pochodzących od rodzica parentWidget mającego nazwę „widgetname":

QList<QWidget > widgets = parentWidget.findChildren<QWidget>(„widgetname");

Kolejny przykład zwraca wszystkie obiekty typu QPushButton będące potomkami widżetu parentWidget:

Qlist<QPushButton > allPButtons = parentWidget.findChildren<QPushButton>()

Uwaga: Funkcja nie jest dostępna w MSVC 6. W zastępstwie należy użyć qFindChildren() jeśli jest konieczność użycia tego kompilatora.

QList<T> findChildren(const QRegExp & regExp) const

QList<T> QObject::findChildren(const QRegExp & regExp) const Jest to przeciążenie metody findChildren(). Zwraca potomki danego obiektu, które mogą być rzutowane na typ T i mają nazwy odpowiadające wyrażeniom regularnym regExp albo pustą listę jeśli takie obiekty nie występują. Wyszukiwanie przebiega rekursywnie.

Uwaga: Funkcja nie jest dostępna w MSVC 6. W zastępstwie należy użyć qFindChildren() jeśli jest konieczność użycia tego kompilatora.

bool inherits(const char* className) const

bool QObject::inherits(const char* className) const Zwraca prawdę jeżeli obiekt jest instancją klasy dziedziczącej po className, albo subklasą QObject, która dziedziczy po className; w innym przypadku zwraca fałsz. A class is considered to inherit itself. Przykład:

QTimer *timer = new QTimer; //QTimer dziedziczy po QObject
timer->inherits(„QTimer"); //zwraca prawdę
timer->inherits(„QObject"); //zwraca prawdę
timer->inherits(„QAbstractButton"); //zwraca fałsz

// QVBoxLayout dziedziczy po QObject (pośrednio-dziadek) // i QLayoutItem (bezpośrednio-rodzic)

QVBoxLayout layout = new QVBoxLayout;
layout->inherits(„QObject"); //prawda
layout->inherits(„QLayoutItem");//prawda ( pomimo że QLayoutItem to nie //QObject)

Jeśli trzeba określić czy obiekt jest instancją danej klasy w celu rzutowania,

należy się zdecydować na użycie qobject_cast<Type>(object)

void installEventFilter(QObject* filterObj)

void QObject::installEventFilter(QObject* filterObj) Instaluje filtr zdarzeń filterObj dla danego obiektu. Np.:

monitoredObj->installEventFilter(filterObj);

Filtr zdarzeń to taki obiekt, który odbiera wszystkie zdarzenia wysyłane do (monitorowanego) obiektu. Filtr może zdarzenie zatrzymać albo przepuścić do obiektu. Filtr zdarzeń filterObj odbiera zdarzenia za pomocą własnej funkcji eventFilter(). Funkcja ta musi zwrócić prawdę jeżeli zdarzenie ma być odfiltrowane (np. zatrzymane); musi zwrócić fałsz w innym przypadku. Jeśli dla jednego obiektu zainstalowano wiele filtrów zdarzeń to jako pierwszy jest aktywowany filtr zainstalowany jako ostatni.

Daną mamy klasę KeyPressEater (zjadacz klawiszy ;)), która przechwytuje dane

z klawiatury dla monitorowanych obiektów:

class KeyPressEater : public QObject

{

QObject
…

protected:

bool eventFilter(QObject *obj, QEvent *event);

};

bool KeyPressEater::eventFilter(QObject *obj, QEvent *event) {

if(event->type() == QEvent::KeyPress) {
QKeyEvent keyEvent = static_cast<QKeyEvent>(event);
qDebug(„Ate key press %d", keyEvent->key());
return true;
} else {
//standardowa obsługa zdarzeń
return QObject::eventFilter(obj, event);
}

}

A oto jak zainstalować filtr na dwóch widżetach:

KeyPressEater *keyPressEater = new KeyPresEater(this);
QPushButton *pushButton = new QPushButton(this);
QListView listView = new QListView(this);
pushButton-> installEventFilter(keyPressEater);
listView->installEventFilter(keyPressEater);

Klasa QShortcut, dla przykładu, używa tej techniki do rozpoznania użycia skrótu klawiaturowego. Uwaga: Jeśli usunie się obiekt odbiornika w funkcji eventFilter() należy bezwzględnie zwrócić prawdę. Jeśli zwróci się fałsz Qt wyśle zdarzenie do usuniętego obiektu i program się załamie.

Należy zauważyć, iż obiekt filtrujący musi być w tym samym wątku co obiekt bieżący (this). Jeśli filterObj jest w innym wątku funkcja niczego nie wykona. Jeśli albo filterObj albo obiekt bieżący zostaną przeniesione do innego wątku po wywołaniu funkcji, filtr zdarzeń nie będzie wywołany dopóki oba obiekty powtórnie nie będą działały w tym samym wątku (nie zostanie usunięty).

bool isWidgetType() const bool QObject::isWidgetType() const

Zwraca prawdę jeśli obiekt jest widżetem, w przeciwnym wypadku fałsz.

Wywołanie tej funkcji jest jednoznaczne z wywołaniem inherits(„QWidget") z tym, że ta metoda jest wiele szybsza.

void killTimer(int id)

void QObject::killTimer(int id)

Niszczy zagar określony identyfikatorem id.

Identyfikator zegara jest przydzielany funkcją startTimer() gdy uruchamiane jest zdarzenie zegara.

virtual const QMetaObject metaObject() const

const QMetaObject * QObject::metaObject () const [virtual]

Zwraca wskaźnik do meta-obiektu danego objektu.

Meta-obiekt zawiera informacje o klasie, które dziedziczy z QObject, takie jak nazwa klasy, nazwa superklasy, właściwości, sygnały i sloty. Każda subklasa QObject tworzona z użyciem makra Q_OBJECT będzie miała własny meta-obiekt. Informacja zawarta w meta-obiekcie jest wykorzystywana przez mechanizm połączeń sygnał/slot i system właściwości. Także funkcja inherits() bierze użytek z meta-obiektu. Jeśli nie posiadamy wskaźnika do aktualnej instancji obiektu a mimo to chcemy mieć dostęp do meta-obiektu klasy możemy użyć staticMetaObject. Przykład:

QObject obj = new QPushButton;

obj->metaObject()->className(); //zwraca napis „QPushButton"

QPushButton::staticMetaObject.className(); // zwraca napis „QPushButton"

void moveToThread(QThread* targetThread)

void QObject::moveToThread(QThread * targetThread)

Zmienia przypisanie do wątku obiektu i jego potomków. Obiekt nie może być przeniesiony jeśli ma rodzica. Obsługa zdarzeń będzie kontynuowana w targetThread.

Chcąc przenieść obiekt do głównego wątku należy użyć QApplication::instance() aby otrzymać wskaźnik do bieżącej aplikacji a następnie QApplication::thread() aby otrzymać wskaźnik do wątku, w którym aplikacja jest wykonywana. Np.:

myObject->moveToThread(QApplication::instance()->thread());

Jeśli targetThread jest równy zero cała obsługa zdarzeń dla obiektu i jego potomnych zostanie zatrzymana. Należy zauważyć, że wszystkie aktywne zegary obiektu zostaną zresetowane. Zegary zostaną najpierw zatrzymane w bieżącym wątku i uruchomione od nowa ( z tym samym interwałem) w targetThread. W rezultacie, stałe przenoszenie obiektu pomiędzy wątkami może doprowadzić do zawieszenia zdarzeń zegara na czas nieokreślony ( zapętlenia). Zdarzenie QEvent::ThreadChange jest wysyłane do obiektu tuż przed przypisaniem przynależności do wątku. Można obsłużyć to zdarzenie aby wykonać w tym czasie jakieś specjalne działania. Należy pamiętać, że jakiekolwiek nowe zdarzenia kierowane do tego obiektu będą obsługiwane w targetThread.

Uwaga: ta funkcja nie jest bezpieczna dla wątku; bieżący wątek musi być tożsamy z bieżącym przypisaniem wątku. Innymi słowy, funkcja ta może tylko „przepychać" obiekt z bieżącego wątku do innego, nie może go stamtąd „wyciągać".

QString objectName() const

Jest to funkcja dostępu do właściwości objectName, tzw. „geter".

Funkcja „setera" ma postać: void setObjectName(const QString & name).

Właściwość objectName przechowuje nazwę obiektu. Wykorzystywana jest np. gdy poszukujemy obiektu przez nazwę używając findChild() albo findChildren().

QObject* parent() const

QObject * QObject::parent () const

Zwraca wskaźnik do wstępnego obiektu ( rodzica).

QVariant property(const char* name) const

QVariant QObject::property(const char * name) const

Zwraca wartość właściwości o nazwie name.

Jeśli obiekt nie posiada takiej właściwości zwrócony variant jest nieważny (invalid). Informacja o wszystkich dostępnych właściwościach jest dostarczana za pośrednictwem metaObject() i dynamicPropertyNames(). void removeEventFilter(QObject* obj) void QObject::removeEventFilter(QObject * obj)

Usuwa obiekt obj filtra zdarzeń z bieżącego obiektu. Żądanie jest ignorowane jeśli żaden filtr zdarzeń nie był instalowany.

Wszystkie filtry zdarzeń bieżącego obiektu są automatycznie usuwane gdy jest on niszczony. Zawsze jest bezpiecznie usunąć filtr zdarzeń, nawet w trakcie jego aktywacji ( np. z funkcji eventFilter()).

void setObjectName(const QString & name)

objectName : QString

Funkcja „setera" właściwości objectName.

void setParent(QObject* parent)

void QObject::setParent(QObject * parent)

Czyni obiekt potomkiem obiektu parent; ustanawia rodzica.

bool setProperty(const char* name, const QVariant & value)

bool QObject::setProperty( const char * name, const QVariant & value)

Nadaje własności name obiektu wartość value.

Jeśli ta właściwość została w klasie zdefiniowana przy użyciu makra Q_PROPERTY to funkcja zwraca prawdę a fałsz w przeciwnym przypadku. Jeśli tej właściwości nie zdefiniowano za pomocą w.w. makra i dla tego nie jest ona wpisana w meta-obiekt,

to jest ona dodawana jako właściwość dynamiczna a funkcja zwraca fałsz.

bool signalsBlocked() const

bool QObject::signalsBlocked () const

Zwraca prawdę jeśli sygnały są blokowane, fałsz w innym wypadku.

Standardowo sygnały nie są blokowane.

int startTimer(int interval)

int QObject::startTimet (int interval)

Uruchamia zegar i zwraca jego identyfikator albo zero jeśli zegara nie dało się uruchomić.

Zdarzenie zegara będzie wywoływane co przedział interval milisekund dopóki nie zostanie wywołana funkcja killTimer(). Ustawienie interwału na wartość równą zero skutkuje wystąpieniem zdarzenia zegara tylko po każdorazowym obsłużeniu wszystkich zdarzeń okien systemowych. Wraz z wystąpieniem zdarzenia zegara wywoływana jest wirtualna funkcja timerEvent() z parametrem QTimerEvent. Aby przechwycić zdarzenia zegara należy ją przeciążyć. Jeśli jest uruchomione wiele zegarów można użyć QTimerEvent::timerId() do określenia, który z nich został aktywowany. Przykład:

class MyObject : public QObject
{
Q_OBJECT
public:
MyObject(QObject *parent = 0);
protected:
void timerEvent(QTimerEvent *event);
};
MyObject::MyObject(QObject parent)
: QObject(parent)
{
startTimer(50); //interwał = 50 milisekund
startTimer(1000); //interwał = 1 sekunda
startTimer(60000); //interwał = 1 minuta
}
void MyObject::timerEvent(QTimerEvent event)
{
qDebug() << „Timer ID: " << event->timerId();
}
Dokładność zegarów QTimer zależy od systemu operacyjnego i używanego sprzętu (hardware). Większość platform obsługuje je z dokładnością do 20 milisekund; niektóre z większą. Jeśli Qt nie jest w stanie wysłać żądaną ilość zdarzeń zegara, to niektóre będą po prostu dyskretnie pominięte.

Klasa QTimer dostarcza wysokiego poziomu interfejsu programistycznego zawierającego zegary typu single-shot a także sygnały zegara jako zamiennik zdarzeń. Dostępna jest także klasa QBasicTimer – lżejsza w obsłudze niż QTimer i mniej absorbująca niż bezpośrednie używanie identyfikatorów (ID) zegara.

QThread thread() const

QThread * QObject::thread () const

Zwraca wątek, w którym obiekt jest umiejscowiony.

'''SLOTY PUBLICZNE'''

void deleteLater()

void QObject::deleeLater () [slot]

Umieszcza dany obiekt w kolejce obiektów do usunięcia. Obiekt zostanie usunięty gdy powróci kontrola do pętli zdarzeń. Gdy pętla zdarzeń nie została osiągnięta a funkcja już została wywołana (dzieje się tak gdy wywoła się deleteLater() przed wywołaniem QCoreApplication::exec()),obiekt zostanie usunięty skoro tylko program osiągnie pętlę zdarzeń. Działania takie jak wchodzenie/opuszczanie kolejnych pętli zdarzeń (np. związanych z obsługą zdarzeń po wywołaniu dialogu modalnego) opóźnią usunięcie obiektu; aby został usunięty kontrola musi powrócić do pętli zdarzeń z której deleteLater() zostało wywołane.

Wielokrotne wywołanie tej funkcji nie powoduje zagrożeń; po obsłużeniu pierwszego zdarzenia z żądaniem usunięcia obiektu wszelkie inne zdarzenia związane z tym obiektem są usuwane z kolejki.

'''SYGNAŁY'''

void destroyed(QObject* obj = 0)

void QObject::destroyed (QObject * obj = 0 )[signal]

Ten sygnał jest emitowany tuż przed zniszczeniem obiektu obj i nie ma możliwości zablokowania tego sygnału w żaden sposób. Wszystkie potomki obiektu zostaną zniszczone bezpośrednio po emisji sygnału.

'''STATYCZNE SKŁADNIKI PUBLICZNE'''

bool connect(const QObject* sender, const char* signal, const QObject* receiver, const char* method, Qt::ConnectionType type=Qt::AutoConnection)

bool QObject::connect (const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection) [static]

Tworzy połączenie zadanego typu type wiążąc sygnał signal obiektu sender z metodą method w obiekcie odbiornika receiver. Zwraca prawdę jeśli połączenie się powiedzie, w przeciwnym wypadku fałsz.

Specyfikując wartości signal i method należy użyć makr SIGNAL () i SLOT(), jak w przykładzie:

QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QObject::connect(scrollbar, SIGNAL (valueChanged(int)),
label, SLOT (setNum(int)));

W przykładzie zapewniamy, że etykieta zawsze wyświetla aktualną wartość suwaka przewijania. Parametry sygnału i slotu nie mogą zawierać jakichkolwiek nazw zmiennych a jedynie typy. Następny przykład nie będzie pracował poprawnie i zwróci fałsz:

// ŹLE
QObject::connect(scrollBar, SIGNAL (valueChanged(int value)),
label, SLOT (setNum(int value)));

Sygnał może być także podłączony (sprzężony) z innym sygnałem:

class MyWIdget : public QWidget
{
Q_OBJECT
public:
MyWIdget();
signals:
void buttonClicked();
private:
QPushButton *myButton;
};

MyWidget::MyWidget()

{
myButton = new QPushButton(this);
connect(myButton, SIGNAL (clicked()), this, SIGNAL (buttonClicked()));
}

W powyższym przykładzie konstruktor klasy MyWidget przekazuje sygnał od prywatnej zmiennej składowej i czyni go dostępnym pod nazwą odnoszącą się do MyWidget.