【问题标题】:Is there a Qt Dialog or Widget to interactively sort a string list?是否有 Qt Dialog 或 Widget 以交互方式对字符串列表进行排序?
【发布时间】:2012-06-26 22:03:03
【问题描述】:

我需要提供一个重新排序对话框,让用户以交互方式对字符串列表进行排序。 Qt 是否已经提供了适合此目的的东西?

我搜索了常用的论坛和示例,但没有找到合适的。

澄清我需要什么:

原始列表:

  1. FileBaz
  2. FileFoo
  3. 文件栏

用户排序列表

  1. 文件栏
  2. FileFoo
  3. FileBaz

因此,例如合并以前选择的 pdf 文件所需的任意顺序

【问题讨论】:

    标签: c++ qt dialog


    【解决方案1】:

    我不知道。但是,使用Move up 按钮和Move down 按钮与QListWidget 配合使用的简单操作可能会很有用。 UpDown 自然会在各自的方向上移动列表项。

    在我看来,更简单的方法是使用QTreeWidget,因为,如果我没记错的话,有一些简单的函数可以用来交换物品。像

    这样的组合
    void insertTopLevelItem ( int index, QTreeWidgetItem * item )
    QTreeWidgetItem *itemAbove ( const QTreeWidgetItem * item )
    QTreeWidgetItem *itemBelow ( const QTreeWidgetItem * item ) 
    QTreeWidgetItem *currentItem ()
    int indexOfTopLevelItem ( QTreeWidgetItem * item )
    

    可能有用。 (摘自http://qt-project.org/doc/qt-4.8/QTreeWidget.html

    编辑:我没有经常使用QListWidget,但在交换物品的便利性方面似乎与QTreeWidget 非常相似。任何一个都可以。

    【讨论】:

    • @Martin 如果您有工作,请分享。我会对生成的代码非常感兴趣。
    • 当然!我刚刚看了一下 QListWidget,看起来很有希望
    • 除了回答问题外,它什么都做 :( 如果你不知道,你不必广播它......这不是真正有建设性的。答案应该是一个 answer,而不是“好吧,我不知道,但这是我刚刚编造的……”。
    • @KubaOber 这不是我编造的。我研究了适合我解决问题方法的功能(向上和向下按钮)。我没有直接给出代码,而是给了原始海报开始的地方。即使在广泛阅读 Qt 文档之后,我还没有找到您在下面发布的内容。
    【解决方案2】:

    Qt 已经支持它,您无需做任何事情:标准视图自动支持内部拖放,在其中移动项目以更改它们的显示顺序。

    进一步引用文档:

    • 要启用项目拖动,请将视图的 dragEnabled 属性设置为 true。
    • 要允许用户在视图中放置内部或外部项目,请将视图的 viewport() 的 acceptDrops 属性设置为 true。
    • 若要向用户显示当前被拖动的项目将被放置在何处,请设置视图的showDropIndicator 属性。这为用户提供了关于视图中项目放置的持续更新信息。
    • 要使用户能够在视图中移动项目,我们必须将列表小部件的 dragDropMode 设置为 QAbstractItemView::InternalMove

    下面是sscce,您可以运行它来查看它的运行情况。

    #include <QApplication>
    #include <QListWidget>
    #include <QListWidgetItem>
    
    int main(int argc, char ** argv)
    {
        QApplication a(argc, argv);
        QListWidget w;
        w.addItem("Rosalind");
        w.addItem("Celia");
        w.addItem("Adam");
        w.addItem("Jaques");
        w.setDragEnabled(true);
        w.setDropIndicatorShown(true);
        w.setDragDropMode(QAbstractItemView::InternalMove);
        w.show();
        return a.exec();
    }
    

    【讨论】:

    • 再次感谢您的解决方案。如您所见,我将其用作代码的基础
    【解决方案3】:

    为了完整起见: 这是我最终使用的解决方案:

    #include <QtGui>
    
    class SortDialog:public QDialog{
        Q_OBJECT
      public:
        SortDialog(QStringList* pList, QString const& title,  QString const& middleButton);
        int getSelectedItem() const;
    
      private slots:
        void slotAccept();
        void slotItemUp();
        void slotItemDown();
        void slotSelectItem();
    
      private:
        QStringList* mpList;
        QListWidget* mpListWidget;
        int mSelectedItem;
    
    };
    
    
    SortDialog::SortDialog(QStringList* pList, QString const& title,  QString const& middleButton):
      QDialog(),
      mpList(pList),
      mpListWidget(new QListWidget()),
      mSelectedItem(-1){
      this->setWindowTitle(title);
    
      QHBoxLayout* pMainLayout = new QHBoxLayout();
      this->setLayout(pMainLayout);
    
      QVBoxLayout* pListLayout = new QVBoxLayout();
      pMainLayout->addLayout(pListLayout);
    
      pListLayout->addWidget(mpListWidget);
      mpListWidget->setDragEnabled(true);
      mpListWidget->setDropIndicatorShown(true);
      mpListWidget->setDragDropMode(QAbstractItemView::InternalMove);
    
      boostForeach(QString const& string, *mpList) {
        mpListWidget->addItem(string);
      }
      mpListWidget->setMinimumWidth(mpListWidget->sizeHintForColumn(0)+10);
      mpListWidget->adjustSize();
    
      mpList->clear();
    
      QPushButton* confirm = new QPushButton(tr("Confirm"));
      connect(confirm, SIGNAL(clicked()), this, SLOT(slotAccept()));
      pListLayout->addWidget(confirm);
      confirm->setDefault(true);
    
      QVBoxLayout* pUpDownLayout = new QVBoxLayout();
      pMainLayout->addLayout(pUpDownLayout);
    
      QPushButton* up = new QPushButton(tr("Up"));
      connect(up, SIGNAL(clicked()), this, SLOT(slotItemUp()));
      pUpDownLayout->addWidget(up);
    
      QPushButton* down = new QPushButton(tr("Down"));
      connect(down, SIGNAL(clicked()), this, SLOT(slotItemDown()));
      pUpDownLayout->addWidget(down);
    
      QPushButton* ground = new QPushButton(middleButton);
      connect(ground, SIGNAL(clicked()), this, SLOT(slotSelectItem()));
      pUpDownLayout->addWidget(ground);
    
      this->adjustSize();
    }
    
    int SortDialog::getSelectedItem() const{
      return mSelectedItem;
    }
    
    
    void SortDialog::slotAccept(){
      int count = mpListWidget->count();
      for(int index = 0; index < count; index++){
        QListWidgetItem * item = mpListWidget->item(index);
        mpList->push_back(item->text());
      }
    
      this->close();
    }
    
    void SortDialog::slotItemUp(){
      int row = mpListWidget->currentRow();
      if(row>0){
        QListWidgetItem* pTemp = mpListWidget->takeItem(row);
        mpListWidget->insertItem(row-1,pTemp);
        mpListWidget->setCurrentRow(row-1);
      }
    }
    
    void SortDialog::slotItemDown(){
      int row = mpListWidget->currentRow();
      if(row<mpListWidget->count()-1){
        QListWidgetItem* pTemp = mpListWidget->takeItem(row);
        mpListWidget->insertItem(row+1,pTemp);
        mpListWidget->setCurrentRow(row+1);
      }
    }
    
    void SortDialog::slotSelectItem(){
      int count = mpListWidget->count();
      for(int index = 0; index < count; index++){
        QListWidgetItem * item = mpListWidget->item(index);
        QFont font = item->font();
        font.setBold(false);
        item->setFont(font);
      }
    
      mSelectedItem =mpListWidget->currentRow();
      qDebug() << mSelectedItem;
      QListWidgetItem* pTemp = mpListWidget->currentItem();
      QFont font = pTemp->font();
      font.setBold(true);
      pTemp->setFont(font);
    }
    

    【讨论】:

      猜你喜欢
      • 2020-09-16
      • 2011-06-14
      • 2018-09-28
      • 2011-01-16
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 2018-11-30
      相关资源
      最近更新 更多