【问题标题】:Mistake in Code代码错误
【发布时间】:2010-03-02 12:34:31
【问题描述】:

在 Qt 中,我想在 QT Symbian 中自定义列表视图。所以出于定制目的,我为列表视图设置了委托。我也在处理绘画事件..问题是文本颜色。

当从列表视图中选择项目时,我没有获得默认文本颜色。

即下面的示例代码,我有两个字符串,即“item”(主字符串)和“Test”(子字符串)

主字符串以默认选择颜色绘制,但子字符串不会以与主字符串相同的颜色绘制。

我认为我们需要处理选择并获得调色板颜色.. 我没有得到确切的方法。

请给我解决方案。

这里是代码

class SettingDeligate : public QStyledItemDelegate
{
//        Q_OBJECT

    public:
        explicit SettingDeligate(QObject* parent = 0);
        virtual ~SettingDeligate();
        enum ItemDataRole {SubheaderTextRole = Qt::UserRole + 100};
        QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const;
        void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
};

SettingDeligate::SettingDeligate(QObject* parent)
        : QStyledItemDelegate(parent)
{
}

SettingDeligate::~SettingDeligate()
{
}

QSize SettingDeligate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const
{
        QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
        QString line1 = index.data(Qt::DisplayRole).toString();
        QString line2 = index.data(SubheaderTextRole).toString();

        int textW = qMax(option.fontMetrics.width(line1), option.fontMetrics.width(line2));
        //QSize iconSize = icon.actualSize(option.decorationSize);
        QSize iconSize(27,19);
        return QSize(qMax(textW, iconSize.width()) + 4,
                     iconSize.height() + 2 + option.fontMetrics.lineSpacing() * 2 + 4);    
}

void SettingDeligate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
      QStyledItemDelegate::paint(painter,option,index);
      QString headerText(qvariant_cast<QString>(index.model()->data(index, SubheaderTextRole)));
          QPoint point1 (option.rect.topLeft());
      painter->drawText(point1.x()+25,point1.y()+25,headerText);
}
int main(int argc, char *argv[])
{
        QApplication a(argc, argv);

        QListView *MylistView = new QListView();
        MylistView->setViewMode(QListView::ListMode);

        MylistView->setMovement(QListView::Free);
        MylistView->setItemDelegate(new (SettingDeligate));

        MylistView->setSelectionMode(QAbstractItemView::SingleSelection);


         QStandardItemModel *model = new QStandardItemModel();
         MylistView->setModel(model);


                 QStandardItem *item = new QStandardItem("item1");
                 item->setData("Test1", SettingDeligate::SubheaderTextRole);
                 model->appendRow(item);

            QStandardItem *item1 = new QStandardItem("item2");
                item1->setData("Test2", SettingDeligate::SubheaderTextRole);
            model->appendRow(item1);

            QStandardItem *item2 = new QStandardItem("item3");
            item2->setData("Test3", SettingDeligate::SubheaderTextRole);
            model->appendRow(item2);

                QDesktopWidget* desktopWidget = QApplication::desktop();
                //get client rect.
                QRect clientRect = desktopWidget->availableGeometry();

               MylistView->setGeometry(clientRect);
               MylistView->show();
               return a.exec();
}

请帮帮我

谢谢你

【问题讨论】:

  • 你怎么禁用了Q_OBJECT宏?
  • @Karol,仅当我们在 QT 中使用 use 信号和槽时才需要 Q_OBJECT 宏.. 对于元对象.. 因为我在这里没有使用任何信号槽.. 所以它不是必需的

标签: qt listview qt4 custom-controls symbian


【解决方案1】:

试试这个 -

void SettingDeligate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    QStyledItemDelegate::paint(painter,option,index);
    QString headerText(qvariant_cast<QString>(index.model()->data(index, SubheaderTextRole)));
    QPoint point1 (option.rect.topLeft());
    QPalette::ColorGroup colorGroup = QPalette::Normal;
    if(!option.state.testFlag(QStyle::State_Enabled))
        colorGroup = QPalette::Disabled;
    else if (!option.state.testFlag(QStyle::Active))
        colorGroup = QPalette::Inactive;

    QPalette::ColorRole colorRole = QPalette::Text;
    if(option.state.testFlag(QStyle::State_Selected))
        colorRole = QPalette::HighlightedText;
    if(option.status.testFlag(QStyle::State_Editing))
        colorRole = QPallete::Text;
    painter->setPen(option.palette.color(colorGroup, colorRole));
    painter->drawText(point1.x()+25,point1.y()+25,headerText);
}

状态到颜色组/颜色角色的映射来自 CE_ItemViewItem 元素的 QCommonStyle::DrawControl 的文本绘制部分。

【讨论】:

  • 嘿,我遇到了问题,当项目被选中时......当项目被选中时,我没有得到默认颜色来绘制
【解决方案2】:

这是用于 symbian 的 Qt 4.6.2 中的一个错误。

希望它可能在下一个版本中得到修复..

仅供参考....

Check out here

【讨论】:

    猜你喜欢
    • 2021-08-14
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多