Wenn du nur einen Zeiger auf die Punkte speicherst wirst du unter Umständen Speicherfehler bekommen. So wie der Code in deinem letzten Post steht, sogar ganz bestimmt.
Ich habe mal zwei Dateien angehängt, als kleines Beispiel wie du die Verbindung zwischen Label und Mainwindow herstellen kannst.
Erst "moc -o xw.moc.cc xw.hh" aufrufen. Dann xw.cc kompilieren. Die Ausgabe von moc wird in xw.cc unten eingebunden, es ist also nicht notwendig noch irgendwelche .o-Dateien einzubinden.
Okay... Dateien anhängen geht aus irgendeinem Grund nicht, also hier direkt:
xw.hh:
Code:
#ifndef XW_HH
#define XW_HH
#include "QtCore/QObject"
#include "QtCore/QPointF"
#include "QtGui/QApplication"
#include "QtGui/QColor"
#include "QtGui/QHBoxLayout"
#include "QtGui/QPainter"
#include "QtGui/QPen"
#include "QtGui/QPushButton"
#include "QtGui/QWidget"
class X : public QWidget // Dies ist die "Label"-Klasse, welche das Dreieck anzeigt.
{
Q_OBJECT
public:
X(QWidget* parent) : QWidget(parent), do_highlight(false)
{
setMinimumSize(400, 300);
setAutoFillBackground(true);
}
public Q_SLOTS:
void highlight(bool yes_or_no, QPointF a, QPointF b, QPointF c)
{
do_highlight = yes_or_no;
points[0] = a; points[1] = b; points[2] = c;
update();
}
protected:
virtual void paintEvent(QPaintEvent*)
{
if(do_highlight) {
QPainter painter(this);
QPen pen(QColor(255, 0, 0));
pen.setWidth(3);
painter.setPen(pen);
painter.drawConvexPolygon(points, 3);
}
}
private:
bool do_highlight;
QPointF points[3];
};
class W : public QWidget // Dies ist die "Mainwindow"-Klasse.
{
Q_OBJECT
public:
W() : layout(this), show_button("Press!", this), exit_button("Exit!", this), triangle(this)
{
setLayout(&layout);
layout.addWidget(&show_button);
layout.addWidget(&exit_button);
layout.addWidget(&triangle);
show_button.setCheckable(true); // Die letzten fünf Zeilen waren Vorarbeiten..
QObject::connect(&show_button, SIGNAL(clicked(bool)), this, SLOT(button_clicked(bool))); // Interne Verbindung.
QObject::connect(&exit_button, SIGNAL(pressed()), QApplication::instance(), SLOT(quit())); // Beendet Programm auf Klick.
QObject::connect(this, SIGNAL(have_points(bool, QPointF, QPointF, QPointF)), &triangle, SLOT(highlight(bool, QPointF, QPointF, QPointF)));
// Die letzte Zeile verbindet die beiden Klassen miteinander.
}
Q_SIGNALS:
void have_points(bool yes_or_no, QPointF a, QPointF b, QPointF c); // Dieses ist das Signal welches die beiden Klassen verbindet.
private Q_SLOTS:
void button_clicked(bool checked) { // Dies ist ein "interner" Slot.
QPointF p1(10.0, 10.0), p2(100.0, 100.0), p3(190.0, 10.0); // Diese Punkte dienen nur als Beispiel.
// Folgende Zeile ist die "Magie": Hier wird das clicked()-Signal des Pushbuttons auf die richige Signatur erweitert.
Q_EMIT have_points(checked, p1, p2, p3);
// Der Pushbutton löst also indirekt have_points(bool, QPointF, QPointF, QPointF) aus.
}
private:
QHBoxLayout layout;
QPushButton show_button, exit_button;
X triangle;
};
#endif
xw.cc:
Code:
#include "xw.hh"
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
W w;
w.show();
return app.exec();
}
#include "xw.moc.cc"
Lesezeichen