代码摘自C++ GUI Qt 4th:
头文件:
#ifndef FLOWCHARTSYMBOLPICKER_H
#define FLOWCHARTSYMBOLPICKER_H
#include <QtGui/QDialog>
class QListWidget;
class QPushButton;
class FlowChartSymbolPicker : public QDialog
{
Q_OBJECT
public:
FlowChartSymbolPicker(const QMap<int,QString>&symbolMap,QWidget *parent=0);
int selectId() const { return id; }
~FlowChartSymbolPicker();
protected:
QPushButton *btnOK;
QPushButton *btnCancel;
protected slots:
void done(int result);
private:
int id;
QListWidget *listWidget;
};
#endif // FLOWCHARTSYMBOLPICKER_H
实现文件:
#include "flowchartsymbolpicker.h"
#include <QListWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>
#include <qDebug>
FlowChartSymbolPicker::FlowChartSymbolPicker(const QMap<int,QString>&symbolMap,QWidget *parent/* =0 */)
{
id=-1;
listWidget=new QListWidget;
QMapIterator<int,QString> i(symbolMap);
while(i.hasNext())
{
i.next();
QListWidgetItem *item=new QListWidgetItem(i.value(),listWidget);
item->setIcon(QIcon(".//icon.png"));
item->setData(Qt::UserRole,i.key());
}
btnOK=new QPushButton("OK");
btnCancel=new QPushButton("Cancel");
QHBoxLayout *btnLayout=new QHBoxLayout;
btnLayout->addWidget(btnOK);
btnLayout->addWidget(btnCancel);
QVBoxLayout *mainLayout=new QVBoxLayout;//(this);
//mainLayout->addStretch(); ///占满多余空间
mainLayout->addWidget(listWidget);
mainLayout->addLayout(btnLayout);
setLayout(mainLayout);
connect(btnOK,SIGNAL(clicked()),this,SLOT(accept())); //调用done函数
connect(btnCancel,SIGNAL(clicked()),this,SLOT(reject())); ///调用done函数
}
void FlowChartSymbolPicker::done(int result)
{
qDebug()<<"-----------------------------";
id=-1;
if(result==QDialog::Accepted)
{
QListWidgetItem *item=listWidget->currentItem();
if(item)
{
id=item->data(Qt::UserRole).toInt();
}
qDebug()<<id<<"-----------------";
}
QDialog::done(result);
}
FlowChartSymbolPicker::~FlowChartSymbolPicker()
{
}
/*---------------------------------
QIcon XListWidget::iconForSymbol(const QString &symbolName)
{
QString fileName = ":/images/" + symbolName.toLower();
qDebug()<<"fileName"<<fileName;
fileName.replace(' ', '-');
return QIcon(fileName);
}
------------------------------------*/
程序截图:
其中:done函数是由QDialog重新实现的,当用户单击ok或cancel时,就会调用它。对于qt中MVC,还不太懂