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. Drag&drop in other window
Forum Updated to NodeBB v4.3 + New Features

Drag&drop in other window

Scheduled Pinned Locked Moved Unsolved General and Desktop
12 Posts 3 Posters 344 Views 2 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.
  • mrjjM Offline
    mrjjM Offline
    mrjj
    Lifetime Qt Champion
    wrote on last edited by
    #3

    Hi
    Is that this example?
    https://doc.qt.io/qt-5/qtwidgets-draganddrop-puzzle-example.html

    I tried to make puzzleWidget fullscreen but it still worked.
    alt text

    1 Reply Last reply
    2
    • M Offline
      M Offline
      magicDM
      wrote on last edited by magicDM
      #4

      I think, that problem connected with widget attributes:
      Widget

      #ifndef WIDGET_H
      #define WIDGET_H
      
      #include <QWidget>
      
      class Widget : public QWidget
      {
      	Q_OBJECT
      public:
      	explicit Widget(QWidget *parent = nullptr);
      
      	void turnOnFullscreen();
      
      	void dragEnterEvent(QDragEnterEvent *event) override;
      	void dropEvent(QDropEvent *event) override;
      
      signals:
      
      };
      
      #endif // WIDGET_H
      
      // ==========================================================
      #include "widget.h"
      
      #include <QApplication>
      #include <QWindow>
      #include <QDragEnterEvent>
      #include <QDropEvent>
      #include <QDebug>
      
      Widget::Widget(QWidget *parent) : QWidget(parent)
      {
      	setAcceptDrops(true);
      	setAttribute(Qt::WA_NativeWindow); // comment it, to fix problem
      	setAttribute(Qt::WA_AcceptTouchEvents);
      	setAutoFillBackground(false);
      	setUpdatesEnabled(true);
      	setFocusPolicy(Qt::StrongFocus);
      	setMouseTracking(true);
      	setTabletTracking(true);
      
      	setMinimumSize(600, 600);
      	setMaximumSize(600, 600);
      }
      
      void Widget::turnOnFullscreen()
      {
      	if (!windowState().testFlag(Qt::WindowFullScreen))
      	{
      		if (auto parent = parentWidget())
      		{
      			setWindowIcon(parent->windowIcon());
      		}
      		setParent(nullptr);
      
      		const auto& screens = QApplication::screens();
      		const int screenNumber = 0;
      		if (screenNumber >= 0 && screenNumber < screens.size())
      		{
      			show();
      			windowHandle()->setScreen(screens[screenNumber]);
      		}
      
      		showFullScreen();
      		activateWindow();
      		raise();
      		setFocus();
      	}
      }
      
      void Widget::dragEnterEvent(QDragEnterEvent *event)
      {
      	event->accept();
      }
      
      void Widget::dropEvent(QDropEvent *event)
      {
      	qInfo() << "Drop";
      	event->accept();
      }
      

      MainWindow:

      #ifndef MAINWINDOW_H
      #define MAINWINDOW_H
      
      #include <QMainWindow>
      
      class MainWindow : public QMainWindow
      {
      	Q_OBJECT
      
      public:
      	MainWindow(QWidget *parent = nullptr);
      	~MainWindow();
      };
      #endif // MAINWINDOW_H
      
      // ======================================
      #include "mainwindow.h"
      #include "widget.h"
      
      #include <QCheckBox>
      #include <QVBoxLayout>
      #include <QFrame>
      
      MainWindow::MainWindow(QWidget *parent)
      	: QMainWindow(parent)
      {
      	QFrame *frame = new QFrame;
      	QVBoxLayout* layout = new QVBoxLayout(frame);
      	Widget* widget = new Widget();
      	widget->setStyleSheet("background-color:white;");
      
      	QCheckBox* checkBox = new QCheckBox("fullscreen");
      
      	connect(checkBox, &QCheckBox::stateChanged, [=](int state){
      		if(state == Qt::Checked)
      		{
      			if(widget)
      			{
      				widget->turnOnFullscreen();
      			}
      		}
      		else
      		{
      			// ...
      		}
      	});
      
      
      	layout->addWidget(widget);
      	layout->addWidget(checkBox);
      
      	setCentralWidget(frame);
      }
      
      MainWindow::~MainWindow()
      {
      }
      
      #include "mainwindow.h"
      
      #include <QApplication>
      
      int main(int argc, char *argv[])
      {
      	QApplication a(argc, argv);
      	MainWindow w;
      	w.show();
      	return a.exec();
      }
      
      

      If comment line: setAttribute(Qt::WA_NativeWindow); that drag&drop correct work for other window, but documentation nothing say about it, i think it's bug. OS: windows, QT 15.14.2 MSVC 2017 x64

      mrjjM 1 Reply Last reply
      0
      • M magicDM

        I think, that problem connected with widget attributes:
        Widget

        #ifndef WIDGET_H
        #define WIDGET_H
        
        #include <QWidget>
        
        class Widget : public QWidget
        {
        	Q_OBJECT
        public:
        	explicit Widget(QWidget *parent = nullptr);
        
        	void turnOnFullscreen();
        
        	void dragEnterEvent(QDragEnterEvent *event) override;
        	void dropEvent(QDropEvent *event) override;
        
        signals:
        
        };
        
        #endif // WIDGET_H
        
        // ==========================================================
        #include "widget.h"
        
        #include <QApplication>
        #include <QWindow>
        #include <QDragEnterEvent>
        #include <QDropEvent>
        #include <QDebug>
        
        Widget::Widget(QWidget *parent) : QWidget(parent)
        {
        	setAcceptDrops(true);
        	setAttribute(Qt::WA_NativeWindow); // comment it, to fix problem
        	setAttribute(Qt::WA_AcceptTouchEvents);
        	setAutoFillBackground(false);
        	setUpdatesEnabled(true);
        	setFocusPolicy(Qt::StrongFocus);
        	setMouseTracking(true);
        	setTabletTracking(true);
        
        	setMinimumSize(600, 600);
        	setMaximumSize(600, 600);
        }
        
        void Widget::turnOnFullscreen()
        {
        	if (!windowState().testFlag(Qt::WindowFullScreen))
        	{
        		if (auto parent = parentWidget())
        		{
        			setWindowIcon(parent->windowIcon());
        		}
        		setParent(nullptr);
        
        		const auto& screens = QApplication::screens();
        		const int screenNumber = 0;
        		if (screenNumber >= 0 && screenNumber < screens.size())
        		{
        			show();
        			windowHandle()->setScreen(screens[screenNumber]);
        		}
        
        		showFullScreen();
        		activateWindow();
        		raise();
        		setFocus();
        	}
        }
        
        void Widget::dragEnterEvent(QDragEnterEvent *event)
        {
        	event->accept();
        }
        
        void Widget::dropEvent(QDropEvent *event)
        {
        	qInfo() << "Drop";
        	event->accept();
        }
        

        MainWindow:

        #ifndef MAINWINDOW_H
        #define MAINWINDOW_H
        
        #include <QMainWindow>
        
        class MainWindow : public QMainWindow
        {
        	Q_OBJECT
        
        public:
        	MainWindow(QWidget *parent = nullptr);
        	~MainWindow();
        };
        #endif // MAINWINDOW_H
        
        // ======================================
        #include "mainwindow.h"
        #include "widget.h"
        
        #include <QCheckBox>
        #include <QVBoxLayout>
        #include <QFrame>
        
        MainWindow::MainWindow(QWidget *parent)
        	: QMainWindow(parent)
        {
        	QFrame *frame = new QFrame;
        	QVBoxLayout* layout = new QVBoxLayout(frame);
        	Widget* widget = new Widget();
        	widget->setStyleSheet("background-color:white;");
        
        	QCheckBox* checkBox = new QCheckBox("fullscreen");
        
        	connect(checkBox, &QCheckBox::stateChanged, [=](int state){
        		if(state == Qt::Checked)
        		{
        			if(widget)
        			{
        				widget->turnOnFullscreen();
        			}
        		}
        		else
        		{
        			// ...
        		}
        	});
        
        
        	layout->addWidget(widget);
        	layout->addWidget(checkBox);
        
        	setCentralWidget(frame);
        }
        
        MainWindow::~MainWindow()
        {
        }
        
        #include "mainwindow.h"
        
        #include <QApplication>
        
        int main(int argc, char *argv[])
        {
        	QApplication a(argc, argv);
        	MainWindow w;
        	w.show();
        	return a.exec();
        }
        
        

        If comment line: setAttribute(Qt::WA_NativeWindow); that drag&drop correct work for other window, but documentation nothing say about it, i think it's bug. OS: windows, QT 15.14.2 MSVC 2017 x64

        mrjjM Offline
        mrjjM Offline
        mrjj
        Lifetime Qt Champion
        wrote on last edited by
        #5

        Hi
        I tried
        puzzleWidget->setAttribute(Qt::WA_NativeWindow);
        but it still worked.
        This is Qt 5.14.2, window 10. vs2017

        M 1 Reply Last reply
        2
        • mrjjM mrjj

          Hi
          I tried
          puzzleWidget->setAttribute(Qt::WA_NativeWindow);
          but it still worked.
          This is Qt 5.14.2, window 10. vs2017

          M Offline
          M Offline
          magicDM
          wrote on last edited by
          #6

          @mrjj Are you using this code to turn on fullscreen?

          void PuzzleWidget::turnOnFullscreen()
          {
          	if (!windowState().testFlag(Qt::WindowFullScreen))
          	{
          		if (auto parent = parentWidget())
          		{
          			setWindowIcon(parent->windowIcon());
          		}
          		setParent(nullptr);
          
          		const auto& screens = QApplication::screens();
          		const int screenNumber = 0;
          		if (screenNumber >= 0 && screenNumber < screens.size())
          		{
          			show();
          			windowHandle()->setScreen(screens[screenNumber]);
          		}
          
          		showFullScreen();
          		activateWindow();
          		raise();
          		setFocus();
          	}
          }
          

          Now, i checked, that in my PC incorrect behavior is continues. You can run code (it's full), that i mentioned below

          mrjjM 1 Reply Last reply
          0
          • M magicDM

            @mrjj Are you using this code to turn on fullscreen?

            void PuzzleWidget::turnOnFullscreen()
            {
            	if (!windowState().testFlag(Qt::WindowFullScreen))
            	{
            		if (auto parent = parentWidget())
            		{
            			setWindowIcon(parent->windowIcon());
            		}
            		setParent(nullptr);
            
            		const auto& screens = QApplication::screens();
            		const int screenNumber = 0;
            		if (screenNumber >= 0 && screenNumber < screens.size())
            		{
            			show();
            			windowHandle()->setScreen(screens[screenNumber]);
            		}
            
            		showFullScreen();
            		activateWindow();
            		raise();
            		setFocus();
            	}
            }
            

            Now, i checked, that in my PC incorrect behavior is continues. You can run code (it's full), that i mentioned below

            mrjjM Offline
            mrjjM Offline
            mrjj
            Lifetime Qt Champion
            wrote on last edited by
            #7

            @magicDM
            Well i just did

            MainWindow::MainWindow(QWidget *parent)
                : QMainWindow(parent)
            {
                setupMenus();
                setupWidgets();
                setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
                setWindowTitle(tr("Puzzle"));
            
                puzzleWidget->setParent(nullptr);
                puzzleWidget->show();    
                puzzleWidget->showFullScreen();
                puzzleWidget->activateWindow();
                puzzleWidget->raise();
                puzzleWidget->setFocus();
                puzzleWidget->setAttribute(Qt::WA_NativeWindow);
            
            }
            

            So it seems the same except the monitor handling but i only have one monitor so seems pretty much the same.

            mrjjM 1 Reply Last reply
            1
            • mrjjM mrjj

              @magicDM
              Well i just did

              MainWindow::MainWindow(QWidget *parent)
                  : QMainWindow(parent)
              {
                  setupMenus();
                  setupWidgets();
                  setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
                  setWindowTitle(tr("Puzzle"));
              
                  puzzleWidget->setParent(nullptr);
                  puzzleWidget->show();    
                  puzzleWidget->showFullScreen();
                  puzzleWidget->activateWindow();
                  puzzleWidget->raise();
                  puzzleWidget->setFocus();
                  puzzleWidget->setAttribute(Qt::WA_NativeWindow);
              
              }
              

              So it seems the same except the monitor handling but i only have one monitor so seems pretty much the same.

              mrjjM Offline
              mrjjM Offline
              mrjj
              Lifetime Qt Champion
              wrote on last edited by
              #8

              @mrjj
              Ok tried yours turnOnFullscreen()
              just for kick and still working.

              I go fullscreen from start. Do you start up in normal mode and then swap ?

              M 1 Reply Last reply
              1
              • mrjjM mrjj

                @mrjj
                Ok tried yours turnOnFullscreen()
                just for kick and still working.

                I go fullscreen from start. Do you start up in normal mode and then swap ?

                M Offline
                M Offline
                magicDM
                wrote on last edited by
                #9

                @mrjj Yes, now i'm comment windowHandle()->setScreen(screens[screenNumber]); and drag and drop fine work, may be something wrong with it. I go in normal mode, and then via checkbox change state to fullscreen mode

                mrjjM 1 Reply Last reply
                0
                • M magicDM

                  @mrjj Yes, now i'm comment windowHandle()->setScreen(screens[screenNumber]); and drag and drop fine work, may be something wrong with it. I go in normal mode, and then via checkbox change state to fullscreen mode

                  mrjjM Offline
                  mrjjM Offline
                  mrjj
                  Lifetime Qt Champion
                  wrote on last edited by
                  #10

                  @magicDM
                  Hi
                  If i wait and use the menu to call turnOnFullscreen then it stops working and shows
                  the red not accepted on whole form.

                  M 1 Reply Last reply
                  1
                  • mrjjM mrjj

                    @magicDM
                    Hi
                    If i wait and use the menu to call turnOnFullscreen then it stops working and shows
                    the red not accepted on whole form.

                    M Offline
                    M Offline
                    magicDM
                    wrote on last edited by magicDM
                    #11

                    @mrjj This code should simulate problem:

                    #include <QApplication>
                    #include <QMainWindow>
                    #include <QWidget>
                    #include <QTextEdit>
                    #include <QHBoxLayout>
                    #include <QCheckBox>
                    #include <QDebug>
                    
                    class Widget : public QTextEdit
                    {
                    public:
                    	Widget(QWidget* parent = nullptr) : QTextEdit(parent) {
                    		setAcceptDrops(true);
                    		setAttribute(Qt::WA_NativeWindow);
                    		setAttribute(Qt::WA_AcceptTouchEvents);
                    		setAutoFillBackground(false);
                    		setUpdatesEnabled(true);
                    		setFocusPolicy(Qt::StrongFocus);
                    		setMouseTracking(true);
                    		setTabletTracking(true);
                    	}
                    	void turnOnFullscreen()
                    	{
                    		if (!windowState().testFlag(Qt::WindowFullScreen))
                    		{
                    			setParent(nullptr);
                    			show();
                    			showFullScreen();
                    			activateWindow();
                    			raise();
                    			setFocus();
                    		}
                    	}
                    };
                    
                    class MMainWindow : public QMainWindow
                    {
                    public:
                    	MMainWindow(QWidget* parent = nullptr) : QMainWindow(parent)
                    	{
                    		QHBoxLayout* layout = new QHBoxLayout(this);
                    		Widget* textEdit = new Widget(this);
                    		QCheckBox* checkBox = new QCheckBox("Fullscreen mode", this);
                    		QTextEdit* dragText = new QTextEdit("Text for drag and drop", this);
                    		dragText->setReadOnly(true);
                    
                    		connect(checkBox, &QCheckBox::stateChanged, [=](int state){
                    			if(state == Qt::Checked)
                    			{
                    				textEdit->turnOnFullscreen();
                    			}
                    		});
                    
                    		layout->addWidget(textEdit);
                    		layout->addWidget(dragText);
                    		layout->addWidget(checkBox);
                    
                    		QWidget* window = new QWidget(this);
                    		window->setLayout(layout);
                    		setCentralWidget(window);
                    	}
                    };
                    
                    int main(int argc, char *argv[])
                    {
                    	QApplication a(argc, argv);
                    	MMainWindow w;
                    	w.show();
                    	return a.exec();
                    }
                    
                    
                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      magicDM
                      wrote on last edited by
                      #12

                      A bug reported: https://bugreports.qt.io/browse/QTBUG-85775

                      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