Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt5子类化QStyledItemDelegate格式_Qt_Qt5_Qstyleditemdelegate - Fatal编程技术网

Qt5子类化QStyledItemDelegate格式

Qt5子类化QStyledItemDelegate格式,qt,qt5,qstyleditemdelegate,Qt,Qt5,Qstyleditemdelegate,我正在为Qt5中的SQLite数据库开发GUI。我使用QSqlQueryModel和QTableView来存储和显示数据 然后,我创建了一个自定义委托,使用switch语句将表视图中某些列的数值替换为它们的文本(例如1=“Hello”,2=“World”) 代理按其应有的方式显示数据,并在功能上工作。但是,与默认的绘制方法QStyledItemDelegate相比,自定义代理绘制的列具有不同的格式。值在左上角而不是左中角向上,更改的列不再自动展开列以显示完整值,列中的单元格在选中时不会变为蓝色或

我正在为Qt5中的SQLite数据库开发GUI。我使用
QSqlQueryModel
QTableView
来存储和显示数据

然后,我创建了一个自定义委托,使用switch语句将表视图中某些列的数值替换为它们的文本(例如1=“Hello”,2=“World”)

代理按其应有的方式显示数据,并在功能上工作。但是,与默认的绘制方法
QStyledItemDelegate
相比,自定义代理绘制的列具有不同的格式。值在左上角而不是左中角向上,更改的列不再自动展开列以显示完整值,列中的单元格在选中时不会变为蓝色或具有虚线轮廓

我创建了这个示例程序:

#include <QApplication>
#include <QModelIndex>
#include <QPainter>
#include <QStandardItemModel>
#include <QStyledItemDelegate>
#include <QTableView>


class TestDelegate: public QStyledItemDelegate {

    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index)
        const Q_DECL_OVERRIDE
    {
        if (index.column() == 0) {
            int value = index.model()->data(index, Qt::DisplayRole).toInt();
            QString str;
            switch (value) {
            case 1:
                str = "Hello0000";
                break;
            case 2:
                str = "World0000";
                break;
            }
            if (option.state.testFlag (QStyle::State_Selected)) {
                painter->fillRect(option.rect, option.palette.highlight());
                qApp->style()->drawItemText(painter, option.rect, option.displayAlignment, option.palette, true, str, QPalette::HighlightedText);
            } else { 
                painter->drawText(option.rect, option.displayAlignment, str);
            } 
        } else {
            return QStyledItemDelegate::paint(painter, option, index);
        }
    }

};


int main(int argc, char **argv) {
    QApplication app(argc, argv);

    QStandardItemModel model(2, 2);
    model.setHorizontalHeaderItem(0, new QStandardItem(QString("A")));
    model.setHorizontalHeaderItem(1, new QStandardItem(QString("B")));
    model.setData(model.index(0, 0, QModelIndex()), 1);
    model.setData(model.index(1, 0, QModelIndex()), 2);
    model.setItem(0, 1, new QStandardItem(QString("Hello")));
    model.setItem(1, 1, new QStandardItem(QString("World0000")));

    QTableView view;
    view.setItemDelegate(new TestDelegate);
    view.setModel(&model);
    view.resizeColumnsToContents();

    view.show();
    app.exec();
}
#包括
#包括
#包括
#包括
#包括
#包括
类TestDelegate:公共QStyledItemDelegate{
无效绘制(QPainter*绘制者、常量QStyleOptionViewItem和option、常量QModelIndex和索引)
常数Q_DECL_覆盖
{
if(index.column()==0){
int value=index.model()->data(index,Qt::DisplayRole).toInt();
QString-str;
开关(值){
案例1:
str=“Hello0000”;
打破
案例2:
str=“World0000”;
打破
}
if(option.state.testFlag(QStyle::state_Selected)){
painter->fillRect(option.rect,option.palete.highlight());
qApp->style()->drawItemText(画师、option.rect、option.displayAlignment、option.palete、true、str、QPalette::HighlightedText);
}否则{
画师->绘图文本(option.rect、option.displayAlignment、str);
} 
}否则{
返回QStyledItemDelegate::paint(画师、选项、索引);
}
}
};
int main(int argc,字符**argv){
QApplication应用程序(argc、argv);
QS标准模型(2,2);
模型:setHorizontalHeaderItem(0,新的QStandarItem(QString(“A”)));
模型。设置水平头层(1,新的QS标准层(QString(“B”));
model.setData(model.index(0,0,QModelIndex()),1);
setData(model.index(1,0,QModelIndex()),2);
model.setItem(0,1,新的QStandardItem(QString(“Hello”)));
model.setItem(1,1,新的QStandardItem(QString(“World0000”)));
QTableView视图;
view.setItemDelegate(新的TestDelegate);
view.setModel(&model);
view.resizeColumnsToContents();
view.show();
app.exec();
}
这将通过添加
选项来修复文本对齐方式。displayAlignment
painter->drawText()
;我还在if(option.state&QStyle::state_Selected)语句中添加了额外的代码,该语句根据单元格的选择状态绘制单元格。因此,如果未选中,文本为黑色,如果选中,文本将变为白色,背景为蓝色。但是,我仍然无法使列展开以适合单元格的内容,也无法像处理标准委托那样在单元格外部添加虚线


使用自定义绘制方法时,有没有一种简单的方法可以保持表视图的默认样式?

委托是一种相当迂回且不必要的方式。我们已经有了一个观点,把元素描绘得非常完美,不需要重做。我们只需要将修改后的数据传递给视图。因此,我们在源和视图之间插入一个
QIdentityProxyModel
viewmodel

// https://github.com/KubaO/stackoverflown/tree/master/questions/proxy-reformat-39244309
#include <QtWidgets>

class RewriteProxy : public QIdentityProxyModel {
    QMap<QVariant, QVariant> m_read, m_write;
    int m_column;
public:
    RewriteProxy(int column, QObject * parent = nullptr) :
        QIdentityProxyModel{parent}, m_column{column} {}
    void addReadMapping(const QVariant & from, const QVariant & to) {
        m_read.insert(from, to);
        m_write.insert(to, from);
    }
    QVariant data(const QModelIndex & index, int role) const override {
        auto val = QIdentityProxyModel::data(index, role);
        if (index.column() != m_column) return val;
        auto it = m_read.find(val);
        return it != m_read.end() ? it.value() : val;
    }
    bool setData(const QModelIndex & index, const QVariant & value, int role) override {
        auto val = value;
        if (index.column() == m_column) {
            auto it = m_write.find(value);
            if (it != m_write.end()) val = it.value();
        }
        return QIdentityProxyModel::setData(index, val, role);
    }
};

int main(int argc, char ** argv) {
    QApplication app{argc, argv};
    QStandardItemModel model{2,2};
    model.setData(model.index(0, 0), 1);
    model.setData(model.index(1, 0), 2);
    model.setData(model.index(0, 1), "Zaphod");
    model.setData(model.index(1, 1), "Beeblebrox");

    RewriteProxy proxy{0};
    proxy.setSourceModel(&model);
    proxy.addReadMapping(1, "Hello");
    proxy.addReadMapping(2, "World");

    QTableView ui;
    ui.setModel(&proxy);
    ui.show();
    return app.exec();
}
//https://github.com/KubaO/stackoverflown/tree/master/questions/proxy-reformat-39244309
#包括
类重写代理:公共QidentityProxy模型{
QMap m_读取,m_写入;
int m_列;
公众:
重写代理(int列,QObject*parent=nullptr):
QidentityProxy模型{parent},m_列{column}{
void addReadMapping(常量QVariant&from,常量QVariant&to){
m_read.insert(从,到);
m_write.insert(to,from);
}
QVariant数据(常量QModelIndex&index,int角色)常量覆盖{
auto val=QIdentityProxyModel::数据(索引、角色);
if(index.column()!=m_column)返回val;
自动it=m_read.find(val);
返回它!=m_read.end()?it.value():val;
}
bool setData(常量QModelIndex和index、常量QVariant和value、int角色)重写{
自动值=值;
if(index.column()==m_列){
auto it=m_write.find(值);
如果(it!=m_write.end())val=it.value();
}
返回QIdentityProxyModel::setData(索引、val、角色);
}
};
int main(int argc,字符**argv){
QApplication app{argc,argv};
QS标准模型{2,2};
模型集合数据(模型索引(0,0,1);
setData(model.index(1,0,2));
model.setData(model.index(0,1),“Zaphod”);
model.setData(model.index(1,1),“Beeblebrox”);
重写代理{0};
proxy.setSourceModel(&model);
addReadMapping(1,“你好”);
addReadMapping(2,“世界”);
QTableView用户界面;
ui.setModel(&proxy);
ui.show();
返回app.exec();
}

您能提供您的代表的代码吗?代码不多。它重写委托的绘制方法,方法体中的方法是:if(index.column()==3){//switch语句//painter->drawText(option.rect,literalStr);}else{return QStyledItemDelegate::paint(painter,option,index)如果您只想用字符串值替换数值以显示,您是否考虑过保留默认委托,而不是插入代理模型?您可以子类化
QIdentityProxyModel
并覆盖其
数据()< /代码>方法,这可能是你所需要的。我没有考虑代理,不。我是QT5的新手,看到星代表例子与我想做的类似(改变模型数据在表中的显示),所以我用它作为我的起始PO。