Pixelator也是个自定义委托的例子,这是个挺有意思的例子,好好看看!
这个例子展示了怎么用自定义委托去修改标准视图外观。为了完成这个任务,我们需要实现下面的组件。
1. 一个在图片做为数据项的情况下表示每个像素的模型,在这模型里,每个项都包含一个亮度值一致的像素。
2. 一个自定义委托,它使用被模型提供的信息去表示每个作为白底黑圆的像素,这些圆的半径和它像素点的黑度一致。
意思就是1,我们要实现一个自定义的模型,模型里的项是亮度一致的像素。2,自定义一个委托用使用自定义的模型提供的像素项,让黑色的半径来表示像素点的灰度值。程序截图如下:
程序包含三个主要类,MainWindow主窗口,ImageModel,PixelDelegate。
int main(int argc, char *argv[])
{
Q_INIT_RESOURCE(images);
QApplication app(argc, argv);
MainWindow window;
#if defined(Q_OS_SYMBIAN)
window.showMaximized();
#else
window.show();
#endif
window.openImage(":/images/qt.png"); // 初始化图
return app.exec();
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow();
void openImage(const QString &fileName);
public slots:
void chooseImage(); // 选择图片槽
void printImage(); // 打印图片槽
void showAboutBox(); // 显示aboutBox槽
void updateView(); // 更新视图槽
private:
ImageModel *model; // 模型指针
QAction *printAction; // 打印动作指针
QString currentPath; // 打开选择图片时用的路径
QTableView *view; // 主窗口的表视图指针
};
//! [0]
MainWindow::MainWindow()
{
//! [0]
currentPath = QDir::homePath(); // home路径,就是用户文件夹位置
model = new ImageModel(this); // 创建ImageModel自定义模型
QWidget *centralWidget = new QWidget; // MainWindow中心的主部件,将其他部件都放在它里面
//! [1]
view = new QTableView; // 创建表视图
view->setShowGrid(false); // 不显示表的格子
view->horizontalHeader()->hide(); // 隐藏横向表头
view->verticalHeader()->hide(); // 隐藏纵向表头
view->horizontalHeader()->setMinimumSectionSize(1); // 横向表头最小值
view->verticalHeader()->setMinimumSectionSize(1); // 纵向表头最小值
view->setModel(model); // 为表视图设置模型:ImageModel的实例
//! [1]
//! [2]
PixelDelegate *delegate = new PixelDelegate(this); // 实例化自定义的委托
view->setItemDelegate(delegate); // 为表视图设置委托
//! [2]
//! [3]
// 表视图下方的label和spinBox
QLabel *pixelSizeLabel = new QLabel(tr("Pixel size:"));
QS