1

ユーザーが文字列のリストをインタラクティブに注文できるように、並べ替えダイアログを提供する必要があります。Qtはすでにこの目的に適したものを提供していますか?

通常のフォーラムと例を検索しましたが、適切なものは見つかりませんでした。

必要なものを明確にするには:

生のリスト:

  1. FileBaz
  2. FileFoo
  3. FileBar

ユーザーソートリスト

  1. FileBar
  2. FileFoo
  3. FileBaz

したがって、たとえば以前に選択したpdfファイルをマージするために必要な任意の順序

4

3 に答える 3

2

私が知っていることではありません。Move upただ、ボタンとボタンをMove down組み合わせたシンプルなものQListWidgetは便利かもしれません。Up当然のDownことながら、リスト項目をそれぞれの方向に移動します。

私の意見では、より簡単なのは を使用すること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どちらかが機能します。

于 2012-06-26T22:19:23.383 に答える
1

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();
}
于 2012-06-28T04:04:43.787 に答える
0

完全を期すために:これが私が最終的に使用しているソリューションです:

#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);
}
于 2012-07-17T08:35:56.310 に答える