Qt ListBox Problem
-
hamburger schrieb:
Liegt warscheinlich dadran das ich kein 2tes Objekt der Gui klasse erzeugen kann da es ja dann auf ein anderes objekt zugreift als das was ich möchte
Ohne Code kann man nix sagen. Wenn du das Singleton-Beispiel von Scorcher übernommen hast, hast du nicht genau hingeschaut. Üblicherweise versteckt man bei einem Singleton CTOR, Copy-CTOR, OP=, um garantiert immer nur genau ein Opjekt zu haben - wie es im Beispiel steht.
Nur mal als Frage: Du machst jetzt dein Widget als Singleton? Bist du dir darüber im Klaren, was das im weiteren Verlauf bedeutet? (Widget-Placement, Objekt-Zerstörung, Zugriffe von anderen Threads aus, SEGFAULT, usw)?
-
Ich hab jetzt mal kurz was geschrieben. Eventuelle Fehler darfst du behalten
Logger.hpp
#ifndef LOGGER_CLASS_H #define LOGGER_CLASS_H #include <QObject> #include <QReadWriteLock> struct Log { enum Scope { Info, Warning, Error }; Scope scope; QString message; Log(Scope s=Log::Info, const QString& m=QString()) : scope(s), message(m) {} }; class Logger : public QObject { Q_OBJECT QReadWriteLock lock_; QList<Log> logs_; Logger(); void log(const Log& log); // disable these Logger(const Logger&); Logger& operator=(const Logger&); void setParent(QObject*); public: static Logger& instance(); static void info( const QString& message); static void warning( const QString& message ); static void error( const QString& message ); const QList<Log>& logs() const; signals: void newLog(const Log& log); }; #endif
Logger.cpp
#include <QReadLocker> #include <QWriteLocker> #include <QMetaType> #include "Logger.hpp" Logger::Logger() { qRegisterMetaType<Log>("Log"); } Logger& Logger::instance() { static Logger logger; return logger; } void Logger::log( const Log& log ) { QWriteLocker locker(&lock_); logs_.push_back(log); emit newLog(log); } const QList<Log>& Logger::logs() const { QReadLocker locker(const_cast<QReadWriteLock*>(&lock_)); return logs_; } void Logger::info( const QString& message ) { Logger::instance().log( Log(Log::Info, message) ); } void Logger::warning( const QString& message ) { Logger::instance().log( Log(Log::Warning, message) ); } void Logger::error( const QString& message ) { Logger::instance().log( Log(Log::Error, message) ); }
Win.hpp
#ifndef WIN_CLASS_H #define WIN_CLASS_H #include <QWidget> #include <QTextBrowser> #include <QVBoxLayout> #include <QHBoxLayout> #include <QApplication> #include <QPushButton> #include "Logger.hpp" class Win : public QWidget { Q_OBJECT QTextEdit* logWindow; public: Win() { logWindow = new QTextBrowser; connect(&Logger::instance(), SIGNAL(newLog(const Log&)), SLOT(onNewLog(const Log&))); QPushButton* infoLog = new QPushButton("Info"); QPushButton* warnLog = new QPushButton("Warning"); QPushButton* errorLog = new QPushButton("Error"); QPushButton* quit = new QPushButton("Quit"); connect(infoLog, SIGNAL(clicked()), SLOT(onInfo())); connect(warnLog, SIGNAL(clicked()), SLOT(onWarn())); connect(errorLog, SIGNAL(clicked()), SLOT(onError())); connect(quit, SIGNAL(clicked()), qApp, SLOT(quit())); QHBoxLayout* logLayout = new QHBoxLayout; logLayout->addWidget(infoLog); logLayout->addWidget(warnLog); logLayout->addWidget(errorLog); QVBoxLayout* ml = new QVBoxLayout(this); ml->addWidget(logWindow); ml->addLayout(logLayout); ml->addWidget(quit); } public slots: void onNewLog(const Log& log) { logWindow->append(log.message); } void onInfo() { Logger::info("Button Info"); } void onWarn() { Logger::warning("Button Warning"); } void onError() { Logger::error("Button Error"); } }; #endif
main.cpp
#include <QApplication> #include <QThread> #include <QtCore> #include <QtTest> #include <ctime> #include <cstdlib> #include "Win.hpp" #include "Logger.hpp" void threadLogTest() { std::srand(std::time(0)); while(true) { QTest::qSleep(rand()%1000); Logger::info("Neues Log"); } } int main( int argc, char** argv ) { QApplication app(argc, argv); Win win; win.show(); QtConcurrent::run(&threadLogTest); return app.exec(); }
TEMPLATE = app TARGET = DEPENDPATH += . INCLUDEPATH += . QT += testlib # Input HEADERS += Logger.hpp Win.hpp SOURCES += Logger.cpp main.cpp
Dass du siehst, wie ich das mit separater Logger-Klasse ohne Gui gemeint hab.
-
Danke das du dir so viel mühe gibst. Hier ist nochmal mein komplettes Packet ( Nur GUI ohne andere Funktionen)
Hoffe du könntest mir dabei helfen würd dir wenn du PayPal hast auch n bischen was dafür geben. Danke!
Ps: Der Download link: http://www.farmcrawler.kilu.de/Cppbot/dl/FcMb.rar
-
Du willst also nur ein scheiss Cheattool basteln oder wie muss man das sehen? Die Seite kommt mir mehr als verdächtig vor.
rya.
-
Es ist nicht nur ein scheiß Cheat Tool so wie du es nennst... Es ändert nichts am ablauf des Spiels. Und der Sever ist nur mein Download sever.
-
l'abra d'or schrieb:
eine ziemlich coole Logger Grundklasse
Danke dafür, sowas habe ich gesucht. Ich habe noch
Logger.hpp
#include <QtCore/QDebug> struct Log { // snip coolen code }; QDebug operator<<(QDebug dbg, const Log &l); class Logger : public QObject { // snip coolen code ~Logger(); // snip coolen code public: // snip coolen code };
Logger.cpp
QDebug operator<<(QDebug dbg, const Log &l) { if (l.scope == Log::Info) dbg.nospace() << QString("(Info) ").append(l.message); else if (l.scope == Log::Warning) dbg.nospace() << QString("(Warning) ").append(l.message); else if (l.scope == Log::Error) dbg.nospace() << QString("(Error) ").append(l.message); return dbg.space(); } Logger::~Logger() { if (! logs().isEmpty() ) qDebug() << logs(); // oder wahlweise QFile Ausgabe :) }
dazugepackt