【问题标题】:Drag and Drop from 2 listwidgets , but change text after dropping in 2nd ListWidget从 2 个列表小部件拖放,但在放入第二个 QListWidget 后更改文本
【发布时间】:2020-06-17 19:18:08
【问题描述】:

'Country' QListwidget 将填充国家名称项目,如果用户拖动该项目并将其放在大写 QListWidget 中,它应该向我显示其大写的名称,即项目文本应更改为大写QListWidget。

例如 - country listwidget 中名为“Russia”的项目,拖放后,该项目应重命名为“Moscow”。

到目前为止,启用拖放,我刚刚写了这段代码,

ui->country_listwidget->setDragEnabled(true);

ui->capital_listwidget->setAcceptDrops(true);

这在 QT 中可能吗?

【问题讨论】:

  • "这在 QT 中可行吗?" - 是的。
  • 哦,谢谢,请问如何实现,有哪些步骤

标签: c++ qt


【解决方案1】:

一个简单的解决方案是创建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();
}

【讨论】:

  • 这确实是我想的最简单和最有效的方法,您先生,真是个天才。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 2011-06-03
  • 1970-01-01
  • 2011-05-08
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多