Перетащите и отпустите из 2 виджетов списка, но измените текст после отбрасывания во втором виджете ListWidget - PullRequest
1 голос
/ 17 июня 2020

enter image description here

QListwidget 'Country' будет заполнен элементами с названиями стран, и если пользователь перетащит этот элемент и бросит его в QListWidget с большой буквы, он должен показать мне имя своей столицы. , т.е. текст этого элемента должен измениться на заглавную QListWidget.

например - элемент с именем «Россия» в виджете списка стран, после перетаскивания элемент должен быть переименован в «Москва».

пока что для включения перетаскивания я только что написал этот код,

ui->country_listwidget->setDragEnabled(true);

ui->capital_listwidget->setAcceptDrops(true);

возможно ли это в QT?

1 Ответ

1 голос
/ 17 июня 2020

Простое решение - создать 2 роли, которые хранят каждую информацию, а затем использовать делегата для отображения текста в зависимости от представления:

#include <QtWidgets>

enum CustomRoles {
    CounrtyRole = Qt::UserRole,
    CapitalRole
};

class DisplayDelegate: public QStyledItemDelegate{
public:
    DisplayDelegate(int displayRole=Qt::DisplayRole, QObject *parent=nullptr)
        :QStyledItemDelegate(parent), m_displayRole(displayRole){}
    int getDisplayRole() const{
        return m_displayRole;
    }
    void setDisplayRole(int value){
        m_displayRole = value;
    }
protected:
    void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const{
        QStyledItemDelegate::initStyleOption(option, index);
        QVariant value = index.data(m_displayRole);
        if (value.isValid() && !value.isNull()) {
            option->features |= QStyleOptionViewItem::HasDisplay;
            option->text = displayText(value, option->locale);
        }
    }
private:
    int m_displayRole;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QListWidget *country_lw = new QListWidget;
    country_lw->setItemDelegate(new DisplayDelegate(CounrtyRole));
    QListWidget *capital_lw = new QListWidget;
    capital_lw->setItemDelegate(new DisplayDelegate(CapitalRole));

    country_lw->setDragEnabled(true);
    capital_lw->setAcceptDrops(true);

    QListWidgetItem *item1 = new QListWidgetItem;
    item1->setData(CounrtyRole, "Country1");
    item1->setData(CapitalRole, "Capital1");
    country_lw->addItem(item1);
    QListWidgetItem *item2 = new QListWidgetItem;
    item2->setData(CounrtyRole, "Country2");
    item2->setData(CapitalRole, "Capital2");
    country_lw->addItem(item2);
    QListWidgetItem *item3 = new QListWidgetItem;
    item3->setData(CounrtyRole, "Country3");
    item3->setData(CapitalRole, "Capital3");
    country_lw->addItem(item3);


    QWidget w;
    QHBoxLayout *lay = new QHBoxLayout(&w);
    lay->addWidget(country_lw);
    lay->addWidget(capital_lw);
    w.show();
    return a.exec();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...