मेरे पास एक QListWidget है जिसमें फ़ाइल नाम हैं। किसी आइटम पर राइट-क्लिक करने से एक मेन्यू सामने आता है जिसमें एक Rename... आइटम होता है। Rename... पर क्लिक करने से उपयोगकर्ता फ़ाइल नाम संपादित कर सकता है। अब तक सब ठीक है।

लेकिन Qt क्रिएटर Projects विंडो में, (कहते हैं) foo.cpp पर राइट-क्लिक करें और Rename... का चयन करें, उपयोगकर्ता को एक फ़ील्ड के साथ प्रस्तुत करता है जिसमें foo चयनित है, और .cpp नहीं है। तो डिफ़ॉल्ट क्रिया foo भाग का नाम बदलने के लिए .cpp एक्सटेंशन को बदले बिना है।

यह वही है जो मुझे चाहिए, लेकिन मुझे क्यूटी के सार्वजनिक एपीआई का उपयोग करके इसे हासिल करने का कोई तरीका नहीं दिख रहा है। मुझे क्या करना होगा? कस्टम प्रतिनिधि, मुझे लगता है; लेकिन यह निश्चित रूप से एक सामान्य आवश्यकता है, इसलिए मुझे आश्चर्य हुआ कि क्या किसी के पास कुछ उपयोग में आसान सी ++ कोड था जिसे मैं सूंघ सकता था?

2
TonyK 6 जिंदा 2021, 02:05

1 उत्तर

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

एक संभावित समाधान एक QObject बनाना है जो संपादक के शो इवेंट को रोकता है और फिर चयन को बदलता है:

#include <QtWidgets>

class Helper: public QObject{
public:
    Helper(QLineEdit *le): QObject(le), m_le(le){
        m_le->installEventFilter(this);
    }
    bool eventFilter(QObject *watched, QEvent *event){
        if(watched == m_le && event->type() == QEvent::Show){
            QString filename = m_le->text();
            QFileInfo fi(filename);
            QString base = fi.baseName();
            m_le->setSelection(0, base.length());
        }
        return QObject::eventFilter(watched, event);
    }
private:
    QLineEdit* m_le;
};

class StyledItemDelegate: public QStyledItemDelegate{
public:
    using QStyledItemDelegate::QStyledItemDelegate;
    QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem & option, const QModelIndex &index) const{
        QWidget *editor = QStyledItemDelegate::createEditor(parent, option, index);
        if(QLineEdit *le = qobject_cast<QLineEdit *>(editor)){
            new Helper(le);
        }
        return editor;
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTreeWidget w;
    w.setItemDelegate(new StyledItemDelegate);
    for(const QString & filename: {"foo.txt", "foo.tar.gz", "foo.cpp"}){
        auto item = new QTreeWidgetItem({filename});
        item->setFlags(item->flags() | Qt::ItemIsEditable);
        w.addTopLevelItem(item);
    }
    w.show();
    return a.exec();
}
3
eyllanesc 6 जिंदा 2021, 02:53
मैंने यह कोशिश की, और यह पूरी तरह से काम करता है। शुक्रिया!
 – 
TonyK
6 जिंदा 2021, 17:19