1 //
2 // file QT4SelectItems.H
3 // Dave Cosgrove
4 // AstraZeneca
5 // 27th June 2006
6 //
7 // Puts up a QListWidget in a box allowing selections from a list of strings.
8 // Similar to QTSelectItems.H but in Qt4 speak.
9 // This must always be used as a modal dialog, since the address of the vector
10 // holding the selections is kept, and this must be in scope when it is filled.
11 // It is filled when either the ok or cancel buttons are pressed.
12
13 #include <QLabel>
14 #include <QLayout>
15 #include <QListWidget>
16 #include <QListWidgetItem>
17 #include <QPushButton>
18
19 #include "QT4SelectItems.H"
20
21 #include <iostream>
22
23 using namespace std;
24
25 namespace DACLIB {
26
27 // ***************************************************************************
QT4SelectItems(const string & label,vector<QString> & item_labels,vector<char> & selected_items,bool radio_box,QWidget * parent)28 QT4SelectItems::QT4SelectItems( const string &label ,
29 vector<QString> &item_labels ,
30 vector<char> &selected_items , bool radio_box ,
31 QWidget *parent ) : QDialog( parent ) {
32
33 setWindowTitle( "Select Items" );
34
35 QWidget *vbox = new QWidget( this );
36
37 list_widget_ = new QListWidget();
38
39 if( radio_box )
40 list_widget_->setSelectionMode( QAbstractItemView::SingleSelection );
41 else
42 list_widget_->setSelectionMode( QAbstractItemView::ExtendedSelection );
43
44 vector<QString>::iterator p , ps;
45 int i = 0;
46 for( p = item_labels.begin() , ps = item_labels.end() ; p != ps ; ++p , ++i ) {
47 QListWidgetItem *item = new QListWidgetItem( *p , list_widget_ );
48 list_widget_->setItemSelected( item , selected_items[i] );
49 }
50
51 connect( list_widget_ , SIGNAL( itemDoubleClicked( QListWidgetItem * ) ) ,
52 this , SLOT( slot_list_double_clicked( QListWidgetItem * ) ) );
53
54 build_action_box();
55
56 vlayout_ = new QVBoxLayout();
57 vlayout_->setDirection( QBoxLayout::BottomToTop );
58 vlayout_->addWidget( action_box_ );
59 vlayout_->addWidget( list_widget_ );
60 vlayout_->addWidget( new QLabel( label.c_str() ) );
61
62 vbox->setLayout( vlayout_ );
63 vbox->show();
64
65 }
66
67 // *****************************************************************************
get_results(vector<char> & selected_items) const68 void QT4SelectItems::get_results( vector<char> &selected_items ) const {
69
70 selected_items = vector<char>( list_widget_->count() , 0 );
71 for( int i = 0 , is = list_widget_->count() ; i < is ; ++i ) {
72 selected_items[i] = list_widget_->isItemSelected( list_widget_->item( i ) );
73 }
74
75 }
76
77 // *****************************************************************************
build_action_box()78 void QT4SelectItems::build_action_box() {
79
80 action_box_ = new QWidget( this );
81 QHBoxLayout *hlayout = new QHBoxLayout();
82
83 QPushButton *button = new QPushButton( "Ok" );
84 button->setDefault( true );
85 hlayout->addWidget( button );
86 connect( button , SIGNAL( clicked() ) , this , SLOT( accept() ) );
87
88 button = new QPushButton( "Cancel" );
89 hlayout->addWidget( button );
90 connect( button , SIGNAL( clicked() ) , this , SLOT( reject() ) );
91
92 action_box_->setLayout( hlayout );
93
94 }
95
96 // *****************************************************************************
97 // select item and out
slot_list_double_clicked(QListWidgetItem * item)98 void QT4SelectItems::slot_list_double_clicked( QListWidgetItem *item ) {
99
100 item->setSelected( true );
101 accept();
102
103 }
104
105 } // EO namespace DACLIB
106