मेरे पास एक QListWidget
है जिसमें फ़ाइल नाम हैं। किसी आइटम पर राइट-क्लिक करने से एक मेन्यू सामने आता है जिसमें एक Rename...
आइटम होता है। Rename...
पर क्लिक करने से उपयोगकर्ता फ़ाइल नाम संपादित कर सकता है। अब तक सब ठीक है।
लेकिन Qt क्रिएटर Projects
विंडो में, (कहते हैं) foo.cpp
पर राइट-क्लिक करें और Rename...
का चयन करें, उपयोगकर्ता को एक फ़ील्ड के साथ प्रस्तुत करता है जिसमें foo
चयनित है, और .cpp
नहीं है। तो डिफ़ॉल्ट क्रिया foo
भाग का नाम बदलने के लिए .cpp
एक्सटेंशन को बदले बिना है।
यह वही है जो मुझे चाहिए, लेकिन मुझे क्यूटी के सार्वजनिक एपीआई का उपयोग करके इसे हासिल करने का कोई तरीका नहीं दिख रहा है। मुझे क्या करना होगा? कस्टम प्रतिनिधि, मुझे लगता है; लेकिन यह निश्चित रूप से एक सामान्य आवश्यकता है, इसलिए मुझे आश्चर्य हुआ कि क्या किसी के पास कुछ उपयोग में आसान सी ++ कोड था जिसे मैं सूंघ सकता था?
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();
}
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।