ui member in statischer funktion!?

Alles rund um die Programmierung mit Qt
Antworten
realdarkman71
Beiträge: 15
Registriert: 21. Oktober 2010 00:15

ui member in statischer funktion!?

Beitrag von realdarkman71 »

Hallo Leute,

ich habe mit dem Designer mein Hauptfenster gestaltet. In der Hauptklasse ist dann ja das Objekt ui, mit dem ich auf die Widgets im Fenster zugreifen kann. Jetzt habe ich in der gleiche Klasse eine statische Funktion, in der ich über das ui Objekt auf die Widgets zugreifen möchte. Klappt aber leider nicht! Der Compiler sagt immer: invalid use of member ‘MainWindow::ui’ in static member function

Wie kann ich das lösen?

Danke und Gruß
Chris
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Wie willst du darauf zugreifen? Wofür brauchst du das in einer statzischen Funktion? Bitte Code! Thx
realdarkman71
Beiträge: 15
Registriert: 21. Oktober 2010 00:15

Beitrag von realdarkman71 »

Ich möchte aus einer anderen Klasse einen Text zur MainWindow-Klasse (über die statischen Funktion) zurückgeben und dort den Text in ein QPlainTextEdit schreiben. Nur kann ich nicht innerhalb der statischen Funktion auf die ui-> Widgets zugreifen!

MainWindow.h:

Code: Alles auswählen

static writeText(QString text);
MainWindow.cpp:

Code: Alles auswählen

MainWindow::writeText(QString text) {
    ui->plainTextEdit->appendPlainText(text);
}
= invalid use of member ‘MainWindow::ui’ in static member function
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

realdarkman71 hat geschrieben:Ich möchte aus einer anderen Klasse einen Text zur MainWindow-Klasse zurückgeben und dort den Text in ein QPlainTextEdit schreiben.
Dann sende ein Signal....

hth...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

... oder mache writeText nicht statisch.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
realdarkman71
Beiträge: 15
Registriert: 21. Oktober 2010 00:15

Beitrag von realdarkman71 »

Ein Signal ist eine gute Idee! Wenn ich die Funktion nicht statisch mache, bleibt das QPlainTextEdit immer leer!

In der anderen Klasse:

Code: Alles auswählen

MainWindow *mainWindow = new MainWindow();
mainWindow->writeTexte("Test!");
Kompiliert zwar ohne Fehler, aber das TextEdit bleibt leer!
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

Kurzform static:
Mit static deklariertes funktioniert ohne konkretes Objekt, deshalb muss gewährleistet sein das alle Sachen die das static deklarierte anfasst auch static sind (das gilt nur für ebenfalls static deklarierte Sachen). Da statics auch ohne Objekt funktionieren gibts das nur einmal pro Klasse, änderst du einen statischen member in einer Instanz des Objekts gilt das ebenso für den statischen member der anderen (die sind in Wirklichkeit ja einunddasselbe).

Code: Alles auswählen

class Demo {
  static int gibts_ohne_objekt;
  int gibts_nicht_ohne_objekt;
public:
  // init des nicht statischen
  Demo () : gibts_nicht_ohne_objekt(-10) { }

  static int gibsmir1 { return gibts_ohne_objekt; }
           int gibsmir2 { return gibts_nicht_ohne_objekt; }
};

// init des statischen
int Demo::gibts_ohne_objekt = 5;

int main() {
  Demo d;
  std::cout << Demo::gibsmir1() << std::endl;
  std::cout << Demo::gibsmir2() << std::endl; // error
  std::cout << d.gibsmir1() << std::endl;
  std::cout << d.gibsmir2() << std::endl;
}
Minibeispiel zum Thema connect:

Code: Alles auswählen

#ifndef MW_H
#define MW_H

#include <QMainWindow>
class QPlainTextEdit;
class QDialog;

class MW : public QMainWindow
{
public:
    MW(QWidget * parent = 0, Qt::WindowFlags flags = 0);
    ~MW();
private:
    QPlainTextEdit * pte;
    QDialog * dia;
};

#endif // MW_H

Code: Alles auswählen

#include "mw.h"
#include <QFrame>
#include <QHBoxLayout>
#include <QLineEdit>
#include <QPlainTextEdit>
#include <QDialog>

MW::MW(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent,flags)
{
    setContentsMargins(10,10,10,10);
    pte = new QPlainTextEdit(this);
    pte->setFrameStyle(QFrame::Panel|QFrame::Sunken);
    setCentralWidget(pte);

    dia = new QDialog(0, Qt::Dialog|Qt::CustomizeWindowHint);
    QHBoxLayout * hbl = new QHBoxLayout(dia);
    QLineEdit * le = new QLineEdit("enter text here");
    hbl->addWidget(le);
    dia->show();

    connect(le,SIGNAL(textChanged(QString)),pte,SLOT(appendPlainText(QString)));
}

MW::~MW() 
{ 
    dia->close(); 
}
Auf Elemente in ui kannst du auch mit ui->widgetname zugreifen ...
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
realdarkman71
Beiträge: 15
Registriert: 21. Oktober 2010 00:15

Beitrag von realdarkman71 »

Das mit dem Thema Signal/Slots ist schon klar! Ich habe das nun mit einem Signal gelöst! Ich hätte da aber auch selber drauf kommen können/sollen/müssen (ist ja auch so Qt like), statt hier das Forum vollzuspammen ... sorry!

Trotzdem vielen Dank für Eure Hilfe! ...manchmal sieht man den Wald vor lauter Bäumen nicht!

Gruß
Chris
Antworten