--- a/src/gui/dialogs/qcolordialog.cpp
+++ b/src/gui/dialogs/qcolordialog.cpp
@@ -147,12 +147,15 @@
     virtual void paintCell(QPainter *, int row, int col, const QRect&);
     virtual void paintCellContents(QPainter *, int row, int col, const QRect&);
 
+    void updateCellSizes();
+
     void mousePressEvent(QMouseEvent*);
     void mouseReleaseEvent(QMouseEvent*);
     void keyPressEvent(QKeyEvent*);
     void focusInEvent(QFocusEvent*);
     void focusOutEvent(QFocusEvent*);
     void paintEvent(QPaintEvent *);
+    void changeEvent(QEvent *);
 
 private:
     Q_DISABLE_COPY(QWellArray)
@@ -225,14 +228,34 @@
 {
     d = 0;
     setFocusPolicy(Qt::StrongFocus);
-    cellw = 28;
-    cellh = 24;
+
+    updateCellSizes();
+
     curCol = 0;
     curRow = 0;
     selCol = -1;
     selRow = -1;
 }
 
+void QWellArray::updateCellSizes()
+{
+    const int cellDistance = 6;
+    const int buttonIconSize = style()->pixelMetric(QStyle::PM_ButtonIconSize);
+    const int diff = buttonIconSize / 8;
+    const int dfw = style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
+
+    cellw = buttonIconSize + diff + 2*dfw + cellDistance;
+    cellh = buttonIconSize - diff + 2*dfw + cellDistance;;
+}
+
+void QWellArray::changeEvent(QEvent *e)
+{
+    if (e->type() == QEvent::StyleChange)
+        updateCellSizes();
+
+    QWidget::changeEvent(e);
+}
+
 QSize QWellArray::sizeHint() const
 {
     ensurePolished();
@@ -668,6 +691,8 @@
     QColorLuminancePicker(QWidget* parent=0);
     ~QColorLuminancePicker();
 
+    QSize sizeHint() const;
+
 public slots:
     void setCol(int h, int s, int v);
     void setCol(int h, int s);
@@ -693,6 +718,29 @@
     QPixmap *pix;
 };
 
+QSize QColorLuminancePicker::sizeHint() const
+{
+    int pickerWidth = -1;
+
+#if defined(QT_SMALL_COLORDIALOG)
+#  ifdef Q_WS_S60
+    const bool nonTouchUI = !S60->hasTouchscreen;
+#  elif defined Q_WS_MAEMO_5
+    const bool nonTouchUI = false;
+#  endif
+
+    QSize screenSize = QApplication::desktop()->availableGeometry(QCursor::pos()).size();
+    const int minDimension = qMin(screenSize.height(), screenSize.width());
+    //set picker to be finger-usable
+    pickerWidth = !nonTouchUI ? minDimension/9 : minDimension/12;
+#else
+    const int buttonIconSize = style()->pixelMetric(QStyle::PM_ButtonIconSize);
+    const int handleWidth = 6;
+    pickerWidth = buttonIconSize - 2 + handleWidth;
+#endif
+
+    return QSize(pickerWidth, -1);
+}
 
 int QColorLuminancePicker::y2val(int y)
 {
@@ -1604,18 +1652,13 @@
     cLay->addSpacing(lumSpace);
 
     lp = new QColorLuminancePicker(q);
+    lp->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
 #if defined(QT_SMALL_COLORDIALOG)
-    QSize screenSize = QApplication::desktop()->availableGeometry(QCursor::pos()).size();
-    const int minDimension = qMin(screenSize.height(), screenSize.width());
-    //set picker to be finger-usable
-    int pickerWidth = !nonTouchUI ? minDimension/9 : minDimension/12;
-    lp->setFixedWidth(pickerWidth);
     if (!nonTouchUI)
         pickLay->addWidget(lp);
     else
         lp->hide();
 #else
-    lp->setFixedWidth(20);
     pickLay->addWidget(lp);
 #endif
 
