Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Communicating between Widgets without parent casting
Forum Updated to NodeBB v4.3 + New Features

Communicating between Widgets without parent casting

Scheduled Pinned Locked Moved General and Desktop
23 Posts 3 Posters 11.5k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Offline
    D Offline
    DerManu
    wrote on last edited by
    #21

    [quote author="TheDestroyer" date="1336489463"]Well, if this can never happen unless there's a bug in my code, how do you explain Andre's response? I think he would've suggested there's a problem in my code if there really would be, don't you think?[/quote]
    I think "this post of his":http://qt-project.org/forums/viewreply/74751/ implies that, but I guess he may explain what he thinks the source of the problem is in follow-up posts.

    For me this is a question of probabilities. Either there's a tremendous bug with catastrophic effects in GCC (think about it, this problem doesn't occur in one of a million runs but consistently!) and nobody else has noticed it yet. Or there's a glitch in your code that you've just overlooked.
    When I understand you correctly, you have used the pointer injected observer pattern in projects before, and it worked, right?

    1 Reply Last reply
    0
    • T Offline
      T Offline
      TheDestroyer
      wrote on last edited by
      #22

      The thing is that the way those GUI's work is different. That's why I could expect a different behaviour.

      Yes, this approach works when I use it outside Qt. But with GUIs of Qt it won't work. No one knows how those meta files of the GUIs are managed..., and how they take information from other objects.

      1 Reply Last reply
      0
      • D Offline
        D Offline
        DerManu
        wrote on last edited by
        #23

        [quote author="TheDestroyer" date="1336490799"]The thing is that the way those GUI's work is different. That's why I could expect a different behaviour.[/quote]Not in such a fundamental way. A QWidget subclass still is a normal C++ class after the moc run, and when it has a pointer member you can do with it whatever you can also do in a non GUI class.
        [quote author="TheDestroyer" date="1336490799"]No one knows how those meta files of the GUIs are managed..., and how they take information from other objects.[/quote]That's not right, what the meta object compiler does is relatively transparent when you look at the outputted moc_ files. No magic going on, it just adds some homebrew RTTI class and boilerplate code to every QObject class to make sigs/slots work. Specifically, it does not touch your settings pointer member.

        I've tried it. Here are three files: main.pro, main.h and main.cpp:
        main.pro:
        @QT += core gui
        TEMPLATE = app
        HEADERS += main.h
        SOURCES += main.cpp@
        main.h:
        @#ifndef HEADER_H
        #define HEADER_H
        #include <QtGui>

        class Settings
        {
        public:
        Settings():intValue(0), boolValue(false) {};
        ~Settings() {}
        int intValue;
        bool boolValue;
        };

        class QTestWidget : public QWidget
        {
        Q_OBJECT
        public:
        explicit QTestWidget(QWidget *parent, Settings *settings);
        protected:
        virtual void paintEvent(QPaintEvent *event);
        private:
        Settings *mSettings;
        QTimer mRenderTimer;
        };

        class MainWindow : public QMainWindow
        {
        Q_OBJECT
        public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow() { delete mSettings; }
        private slots:
        void changeBoolSetting();
        void changeIntSetting();
        private:
        Settings *mSettings;
        };

        #endif // HEADER_H@
        and main.cpp:
        @#include "main.h"

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

        // === Implementation of MainWindow, QTestWidget and Settings ===

        MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        mSettings(new Settings)
        {
        setGeometry(50, 50, 100, 110);
        QTestWidget *tw = new QTestWidget(this, mSettings);
        QPushButton *b1 = new QPushButton(this);
        QPushButton *b2 = new QPushButton(this);
        tw->setGeometry(5, 5, 90, 70);
        b1->setGeometry(25, 75, 25, 25);
        b2->setGeometry(50, 75, 25, 25);
        connect(b1, SIGNAL(clicked()), SLOT(changeBoolSetting()));
        connect(b2, SIGNAL(clicked()), SLOT(changeIntSetting()));
        }

        void MainWindow::changeBoolSetting()
        {
        mSettings->boolValue = !mSettings->boolValue;
        }

        void MainWindow::changeIntSetting()
        {
        mSettings->intValue += 1;
        }

        QTestWidget::QTestWidget(QWidget *parent, Settings *settings) :
        QWidget(parent),
        mSettings(settings)
        {
        connect(&mRenderTimer, SIGNAL(timeout()), this, SLOT(update()));
        mRenderTimer.start(500);
        }

        void QTestWidget::paintEvent(QPaintEvent *event)
        {
        Q_UNUSED(event)
        QPainter painter(this);
        painter.drawRect(rect().adjusted(0, 0, -1, -1));
        painter.drawText(rect(),
        Qt::AlignCenter,
        QString::number(mSettings->intValue)+"\n"+
        QString(mSettings->boolValue ? "true" : "false"));
        painter.drawText(0, 13, QDateTime::currentDateTime().toString("hh:mm:ss:zzz"));
        }@

        run
        qmake; make; ./main
        and you'll see that it works as expected. Click the two buttons and see the QTestWidget update its display (in 500ms render-intervals), depending on it's injected Settings pointer.

        1 Reply Last reply
        0

        • Login

        • Login or register to search.
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups
        • Search
        • Get Qt Extensions
        • Unsolved