मैं क्यूटी में शुरुआत कर रहा हूँ और मैं अपना पहला प्रोजेक्ट करता हूँ। मैं एक समस्या का सामना कर रहा हूँ।

मैं एक स्क्रॉल क्षेत्र में कुछ संपादन लाइन डालता हूं। यह सभी संपादन टेक्स्ट फाइलों के पथ को गिनना चाहिए। इस ऐप को अधिक उपयोगकर्ता के अनुकूल बनाने के लिए मैंने ड्रैग एंड ड्रॉप को लागू करने का निर्णय लिया। इस तरह, उपयोगकर्ता बस अपने एक्सप्लोरर से एक फाइल ले सकते हैं और इसे लाइन एडिट पर छोड़ सकते हैं जो फाइल के पथ से भर जाएगा।

मेरी समस्या यह है: जब मैं ड्रॉप करने का प्रयास करता हूं, तो सभी संपादन लाइन जहां मेरा माउस गुजरा है, फ़ाइल के पथ से भर जाएगा। अगर मैं बयानों को और बदल देता हूं, तो यह पहली संपादन लाइन है जिसे मेरा माउस पास करता है, जो भर जाएगा लेकिन वह नहीं जहां मेरा माउस ड्रॉप के समय है।

यहाँ कोड:



    void MainWindow::dragEnterEvent(QDragEnterEvent *e)
    {
        e->accept()
    }
     
    void MainWindow::dropEvent(QDropEvent *e)
    {
        foreach (const QUrl &url, e->mimeData()->urls()) {
            QString fileName = StringManagement::getDir(url.toLocalFile());
     
            if(ui->lineEdit->underMouse())
                ui->lineEdit->setText(fileName);
            if(ui->lineEdit_2->underMouse())
                ui->lineEdit_2->setText(fileName);
            if(ui->lineEdit_5->underMouse())
                ui->lineEdit_5->setText(fileName);
            if(ui->lineEdit_9->underMouse())
                ui->lineEdit_9->setText(fileName);
            if(ui->lineEdit_10->underMouse())
                ui->lineEdit_10->setText(fileName);
            if(ui->lineEdit_11->underMouse())
                ui->lineEdit_11->setText(fileName);
        }
    }

दूसरे बिंदु पर जो मुझे वास्तव में समझ में नहीं आता है:

<pre><code>void MainWindow::dragEnterEvent(QDragEnterEvent *e)
{
    qInfo() << "enter";
    e->accept();
}
 
 
void MainWindow::dragLeaveEvent(QDragLeaveEvent *e){
    qInfo() << "leave";
    e->accept();
}

जब मैं अपने माउस को एक संपादन लाइन पर रखता हूं और मैं उस पर रहता हूं, तो मुझे कंसोल में दोनों संदेश दिखाई देंगे ... मुझे उम्मीद है कि जब मेरा माउस प्रवेश करेगा और दूसरा जब मेरा माउस इसे छोड़ देगा।

आपकी मदद के लिए अग्रिम धन्यवाद।

0
antoine 17 मार्च 2021, 12:35

2 जवाब

सबसे बढ़िया उत्तर

ठीक है मुझे समाधान मिल गया है। मैं वास्तव में इसे पसंद नहीं करता क्योंकि मुझे यह वास्तव में साफ नहीं लगता है लेकिन यह काम करता है। अगर दूसरों के पास क्लीनर समाधान है तो मैं इसके लिए खुला हूं। मैंने अपना समाधान यहां रखा है। हो सकता है कि यह भविष्य में किसी की मदद कर सके। मैंने अंत में ड्रॉप मेथोड का उपयोग नहीं किया लेकिन मैंने एक इवेंटफिल्टर का उपयोग किया जो मुझे घटनाओं का बेहतर प्रबंधन करने की सकारात्मकता प्रदान करता है।

<pre><code>MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    {
    this->data = DataModel::GetInstance();
    ui->setupUi(this);
    setAcceptDrops(true);
    //ui->lineEdit->dragEnabled();
    //ui->lineEdit->setAcceptDrops();
    installEventFilter(this);
    ui->lineEdit->installEventFilter(this);
    ui->lineEdit_2->installEventFilter(this);
    ui->lineEdit_5->installEventFilter(this);
    ui->lineEdit_9->installEventFilter(this);
    ui->lineEdit_10->installEventFilter(this);
    ui->lineEdit_11->installEventFilter(this);

    }

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::dragEnterEvent(QDragEnterEvent *e)
  {
      qInfo() << "enter";
      e->accept();
  }

bool MainWindow::eventFilter(QObject* obj, QEvent* event){


    if(event->type() == QEvent::DragEnter){
        if(obj == ui->lineEdit){
            this->flag = 1;
        }
        else if(obj == ui->lineEdit_2){
            this->flag = 2;
        }
        else if(obj == ui->lineEdit_5){
            this->flag = 3;
        }
        else if(obj == ui->lineEdit_9){
            this->flag = 4;
        }
        else if(obj == ui->lineEdit_10){
            this->flag = 5;
        }
        else if(obj == ui->lineEdit_11){
            this->flag = 6;
        }
         qInfo()<<"flag" <<this->flag;
    }


    if(event->type() == QEvent::Drop){
        qInfo()<< obj;
        QDropEvent *drop = static_cast<QDropEvent *>(event);
        foreach (const QUrl &url, drop->mimeData()->urls()) {
            QString fileName = StringManagement::getDir(url.toLocalFile());
            qInfo()<<"flag drop" <<this->flag;
            if(this->flag == 1){
                ui->lineEdit->setText(fileName);
            }
            else if(this->flag == 2){
                ui->lineEdit_2->setText(fileName);
            }
            else if(this->flag == 3){
                ui->lineEdit_5->setText(fileName);
            }
            else if(this->flag == 4){
                ui->lineEdit_9->setText(fileName);
            }
            else if(this->flag == 5){
                ui->lineEdit_10->setText(fileName);
            }
            else if(this->flag == 6){
                ui->lineEdit_11->setText(fileName);
            }
            return true;


       }


    }

}

</code></pre>

मैं अभी के लिए फ़िल्टर में वापसी का प्रबंधन नहीं करता, लेकिन विचार यहाँ है।

0
antoine 18 मार्च 2021, 02:08

मेरी टिप्पणी के आपके उत्तर के बाद मैं आपकी मदद करने की कोशिश करूंगा। मैं क्यूटी का विशेषज्ञ नहीं हूं इसलिए मैं गलत हो सकता हूं लेकिन चूंकि अभी तक कोई जवाब नहीं है, इसलिए मैं एक देने की कोशिश करूंगा।

मैंने आपके कोड को पुन: पेश करने का प्रयास किया और दूसरे प्रश्न के लिए:

    void MainWindow::dragEnterEvent(QDragEnterEvent *e)
    {
        qInfo() << "enter";
        e->accept();
    }
 
    void MainWindow::dragLeaveEvent(QDragLeaveEvent *e)
    {
        qInfo() << "leave";
        e->accept();
    }

मेरा व्यवहार समान है यदि MainWindow और लाइनएडिट दोनों ड्रैग और ड्रॉप (setAcceptDrops(true)) का प्रबंधन करते हैं। मुझे लगता है कि जब आप MainWindow दर्ज करते हैं तो आप "प्रवेश" करते हैं और जब आप lineEdit में प्रवेश करते हैं तो "छोड़ते हैं" क्योंकि यह स्वयं ड्रैग और ड्रॉप का प्रबंधन करता है।

यदि आप सेट करते हैं:

    ui->lineEdit->setAcceptDrops(false);

फिर आप अब "छोड़ें" नहीं।

पहले भाग के लिए

अगर मैं आपके कोड को पुन: पेश करने का प्रयास करता हूं, तो मुझे underMouse() फ़ंक्शन में समस्या है। शायद आपकी समस्या यहीं से आती है? अगर मैं अपना खुद का underMouse() लागू करता हूं तो सब कुछ ठीक है।

मुझे उम्मीद है कि बेहतर क्यूटी ज्ञान वाला कोई और आपकी मदद के लिए आएगा।

0
Irisciences 17 मार्च 2021, 21:06