• 15057阅读
  • 6回复

再求界面问题QComboBox+QItemDelegate+QDateTimeEdit [复制链接]

上一主题 下一主题
离线bangqianchen
 

只看楼主 正序阅读 楼主  发表于: 2008-09-13
— 本帖被 XChinux 执行加亮操作(2008-09-14) —
想实现组合框点下拉按钮就显示一个日期时间控件,下面是代码

头文件:ComboBoxDelegate.h
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef Inc_ComboBoxDelegate_H
#define Inc_ComboBoxDelegate_H

#include <QItemDelegate>
#include <QModelIndex>
#include <QObject>
#include <QSize>
#include <QComboBox>

class ComboBoxDelegate : public QItemDelegate
{
    Q_OBJECT
       
public:
    ComboBoxDelegate(QObject *parent = 0);
   
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
        const QModelIndex &index) const;
   
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model,
        const QModelIndex &index) const;
   
    void updateEditorGeometry(QWidget *editor,
        const QStyleOptionViewItem &option, const QModelIndex &index) const;
};

#endif //Inc_ComboBoxDelegate_H
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

实现文件ComboBoxDelegate.cpp
#include <QtGui>
#include "ComboBoxDelegate.h"

ComboBoxDelegate::ComboBoxDelegate(QObject *parent):QItemDelegate(parent)
{
}

QWidget *ComboBoxDelegate::createEditor(QWidget *parent,
                                       const QStyleOptionViewItem &/* option */,
                                       const QModelIndex &/* index */) const
{
    QDateTimeEdit *editor = new QDateTimeEdit(parent);
    editor->setDisplayFormat("dd/M/yyyy");
    editor->setCalendarPopup(true);
    return editor;   
}

void ComboBoxDelegate::setEditorData(QWidget *editor,const QModelIndex &index) const
{
    QDateTimeEdit *dateEditor = qobject_cast<QDateTimeEdit *>(editor);
    if (dateEditor)
    {
        dateEditor->setDate(QDate::fromString(index.model()->data(index, Qt::EditRole).toString(), "d/M/yyyy"));
    }
}

void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                   const QModelIndex &index) const
{
    QDateTimeEdit *dateEditor = qobject_cast<QDateTimeEdit *>(editor);
    if (dateEditor)
    {
        model->setData(index, dateEditor->date().toString("dd/M/yyyy"));
    }
}

void ComboBoxDelegate::updateEditorGeometry(QWidget *editor,
                                           const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
    editor->setGeometry(option.rect);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////
在使用的地方:
    QComboBox* pCmb = new QComboBox(this);
    pCmb ->setItemDelegate(new ComboBoxDelegate(this));
点击组合框的下拉按钮没有任何反应在,如果把组合框换为QTableWidget就没有问题。
    QTableWidget * plst = new QTableWidget(1,1,this);
    plst->setItemDelegate(new ComboBoxDelegate(this));

请问问题在那里?

另外,我想把组合框换成QLineEdit控件,感觉这样设置时间更合理一些,点一下QLineEdit就弹出QDateTimeEdit 设时间,但QLineEdit并没有setItemDelegate接口,不能这样做,另外也想过把QListWidget设置显示为一行来替换QComboBox,但显示并不理想,并且点击相关item也没有弹出QDateTimeEdit,请问有什么办法实现这样的效果么?


离线kelvinyeah
只看该作者 6楼 发表于: 2010-06-02
多谢赐教,收益收益
工作与IT关系不大了,从此将编程当乐趣发展!
离线chongxu
只看该作者 5楼 发表于: 2008-12-30
呵呵 原来是直接组合就可以用啊。解决了。QDateTimeEdit *editor = new QDateTimeEdit(this);
        editor->setDisplayFormat("dd/M/yyyy");
        editor->setCalendarPopup(true);
         QLineEdit *asdasdas =  new QLineEdit(editor);
         verticalLayout_2->addWidget(asdasdas);
离线chongxu
只看该作者 4楼 发表于: 2008-12-30
不好意思啊,能帖出代码最好了。我是想点lineedit后就出现日期的选项 form。人太笨了,不知道怎么才能实现。
[ 此贴被chongxu在2008-12-30 15:53重新编辑 ]
离线lazybone
只看该作者 3楼 发表于: 2008-12-30
引用第1楼bangqianchen于2008-09-17 08:11发表的  :
已经解决,要实现的功能QDateTimeEdit本身就支持,只要调用setCalendarPopup(true)就可以了,开始我还以为要自己实现。


当初自己也是实现后 发现Qt自带 呵呵
离线chongxu
只看该作者 2楼 发表于: 2008-12-30
我是qt新手我也 向想做一个和楼一样的效果 ,不知道楼主是怎么解决的。能把解决的方法写出来下吗?
离线bangqianchen

只看该作者 1楼 发表于: 2008-09-17
已经解决,要实现的功能QDateTimeEdit本身就支持,只要调用setCalendarPopup(true)就可以了,开始我还以为要自己实现。
快速回复
限100 字节
 
上一个 下一个