在 Qt 设计器中创建要提升的自定义小部件

Posted

技术标签:

【中文标题】在 Qt 设计器中创建要提升的自定义小部件【英文标题】:Creating custom widget to be promoted in Qt designer 【发布时间】:2011-11-15 15:24:33 【问题描述】:

我正在使用 Qt 开发一个 GUI 应用程序,但在我的 ui 中嵌入自定义小部件时遇到了一些困难。从 Qt 的documentation 我可以看到可以推广这样的小部件。但是,我仍然对如何做到这一点感到有些困惑。

我的小部件 QTreeWidget 深受 Qt 的 torrent example 的启发,我想将它嵌入到我的应用程序中:

所以我有我的 FilesView 类(不包括 src 代码,因为它是微不足道的):

#include <QTreeWidget>
#include <QUrl>
#include <QFile>
#include <QDragMoveEvent>
#include <QDropEvent>

// FilesView extends QTreeWidget to allow drag and drop.
class FilesView : public QTreeWidget

    Q_OBJECT
public:
    FilesView(QWidget *parent = 0);

signals:
    void fileDropped(const QString &fileName);

protected:
    void dragMoveEvent(QDragMoveEvent *event);
    void dropEvent(QDropEvent *event);
;

这是一个 TorrentViewDelegate 类(评论进度条以进行测试)

#include <QItemDelegate>
#include <QMainWindow>
#include <QApplication>

// TorrentViewDelegate is used to draw the progress bars.
class TorrentViewDelegate : public QItemDelegate

    Q_OBJECT
public:
    inline TorrentViewDelegate(QMainWindow *mainWindow) : QItemDelegate(mainWindow) 

    inline void paint(QPainter *painter, const QStyleOptionViewItem &option,
                      const QModelIndex &index ) const
    
        if (index.column() != 2) 
            QItemDelegate::paint(painter, option, index);
            return;
        

        // Set up a QStyleOptionProgressBar to precisely mimic the
        // environment of a progress bar.
        QStyleOptionProgressBar progressBarOption;
        progressBarOption.state = QStyle::State_Enabled;
        progressBarOption.direction = QApplication::layoutDirection();
        progressBarOption.rect = option.rect;
        progressBarOption.fontMetrics = QApplication::fontMetrics();
        progressBarOption.minimum = 0;
        progressBarOption.maximum = 100;
        progressBarOption.textAlignment = Qt::AlignCenter;
        progressBarOption.textVisible = true;

        // Set the progress and text values of the style option.
        //int progress = qobject_cast<MainWindow *>(parent())->clientForRow(index.row())->progress();
        int progress = 40;
        progressBarOption.progress = progress < 0 ? 0 : progress;
        progressBarOption.text = QString().sprintf("%d%%", progressBarOption.progress);

        // Draw the progress bar onto the view.
        QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);
    
;

在示例中,将小部件嵌入 MainWindow 为:

filesView = new FilesView(this);
filesView->setItemDelegate(new TorrentViewDelegate(this));
filesView->setHeaderLabels(headers);
filesView->setSelectionBehavior(QAbstractItemView::SelectRows);
filesView->setAlternatingRowColors(true);
filesView->setRootIsDecorated(false);
ui->verticalLayout_Filebox->addWidget(filesView);

如何通过 Qt 设计器做到这一点?

【问题讨论】:

【参考方案1】: 在您希望拥有FilesView 的位置放置一个空小部件 右键单击它并选择推广到提升的类名设置为FilesView添加然后提升 不能从 QtDesigner 设置委托

更多信息请看这里:

http://qt-project.org/doc/qt-4.8/designer-using-custom-widgets.html

您拥有的第二个选项是为您的小部件创建一个插件,允许您通过设计器设置其属性。如果您不打算多次使用您的小部件,我不建议这样做。更多详情请查看以下链接:

http://qt-project.org/doc/qt-4.8/designer-creating-custom-widgets.html

【讨论】:

谢谢,我完全尝试了这些步骤,但我对如何处理委托感到困惑。愚蠢,我没想到在 main_window 类中手动执行此操作。现在它起作用了。附言。它与我在解释中链接到的文档相同。

以上是关于在 Qt 设计器中创建要提升的自定义小部件的主要内容,如果未能解决你的问题,请参考以下文章

如何让 qt 设计器自定义 QOpenGLWidget 小部件背景透明?

PyQt 设计师提升小部件 - 引用***对象?

qt minimumSize() 返回 0 但在 qt 设计器中它设置为非零

Qt 设计师:嵌套的小部件不是成员吗?

如何将 QGraphicsView 提升为 .ui 文件中的自定义小部件?

使用 Qt Creator 中设计的自定义小部件将页面动态添加到 QStackedWidget