ユーザーが文字列のリストをインタラクティブに注文できるように、並べ替えダイアログを提供する必要があります。Qtはすでにこの目的に適したものを提供していますか?
通常のフォーラムと例を検索しましたが、適切なものは見つかりませんでした。
必要なものを明確にするには:
生のリスト:
- FileBaz
- FileFoo
- FileBar
ユーザーソートリスト
- FileBar
- FileFoo
- FileBaz
したがって、たとえば以前に選択したpdfファイルをマージするために必要な任意の順序
私が知っていることではありません。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
どちらかが機能します。
Qt は既にサポートしています。ユーザーが行うことは何もありません。標準ビューは、アイテムを移動して表示順序を変更する内部ドラッグ アンド ドロップを自動的にサポートします。
ドキュメントをさらに引用:
dragEnabled
プロパティを true に設定します。acceptDrops
プロパティを true に設定します。showDropIndicator
プロパティを設定します。これにより、ユーザーはビュー内のアイテムの配置に関する情報を継続的に更新できます。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();
}
完全を期すために:これが私が最終的に使用しているソリューションです:
#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);
}