【问题标题】:Sample code for dialog like Qt Creator Options tabQt Creator 选项选项卡等对话框的示例代码
【发布时间】:2015-02-25 14:04:28
【问题描述】:

我想建立与 Qt Creator“选项”选项卡相同的对话框,左侧页面标题为滚动条,右侧为详细页面。

如果有代码示例或示例应用程序可供参考,那将非常有帮助。

提前致谢

【问题讨论】:

  • 这是一个无益的问题。最好的情况是它没有试图解决的特定问题,最坏的情况是在寻找某人为你编写对话主干。我建议您开始编写自己的代码并在遇到问题时提出问题。
  • Qt源码有这样的例子。

标签: c++ qt user-interface dialog options


【解决方案1】:

Qt Creator 源代码

Qt Creator 在 Gitorious 和 GitHub 中都有它的源代码。但是因为 Qt Creator 是一个如此庞大而复杂的项目,所以要找到它的子部分可能会让人不知所措。

Github 版本非常易于搜索。最终,与 Qt Creator 中漂亮的选项页面相关的源代码使用 IOptionsPage 作为“选项”对话框中显示的任何页面的基类。

https://github.com/qtproject/qt-creator/search?utf8=%E2%9C%93&q=ioptionspage&type=Code

ioptionspage.cpp 包含解释不同插槽用途的所有 cmets。

https://github.com/qtproject/qt-creator/blob/9926fc2ab12ccaa02b7f03b416c54cd58ef30b31/src/plugins/coreplugin/dialogs/ioptionspage.cpp

基本上对于 Qt Creators 选项页面,它有一个供多个不同子模块使用的界面。

https://github.com/qtproject/qt-creator/blob/9926fc2ab12ccaa02b7f03b416c54cd58ef30b31/src/plugins/coreplugin/dialogs/ioptionspage.h

#ifndef IOPTIONSPAGE_H
#define IOPTIONSPAGE_H

#include <coreplugin/id.h>

#include <QIcon>
#include <QObject>
#include <QStringList>

namespace Core {

class CORE_EXPORT IOptionsPage : public QObject
{
    Q_OBJECT

public:
    IOptionsPage(QObject *parent = 0);
    virtual ~IOptionsPage();

    Id id() const { return m_id; }
    QString displayName() const { return m_displayName; }
    Id category() const { return m_category; }
    QString displayCategory() const { return m_displayCategory; }
    QIcon categoryIcon() const { return QIcon(m_categoryIcon); }

    virtual bool matches(const QString &searchKeyWord) const;
    virtual QWidget *widget() = 0;
    virtual void apply() = 0;
    virtual void finish() = 0;

protected:
    void setId(Id id) { m_id = id; }
    void setDisplayName(const QString &displayName) { m_displayName = displayName; }
    void setCategory(Id category) { m_category = category; }
    void setDisplayCategory(const QString &displayCategory) { m_displayCategory = displayCategory; }
    void setCategoryIcon(const QString &categoryIcon) { m_categoryIcon = categoryIcon; }

    Id m_id;
    Id m_category;
    QString m_displayName;
    QString m_displayCategory;
    QString m_categoryIcon;

    mutable bool m_keywordsInitialized;
    mutable QStringList m_keywords;
};

/*
    Alternative way for providing option pages instead of adding IOptionsPage
    objects into the plugin manager pool. Should only be used if creation of the
    actual option pages is not possible or too expensive at Qt Creator startup.
    (Like the designer integration, which needs to initialize designer plugins
    before the options pages get available.)
*/

class CORE_EXPORT IOptionsPageProvider : public QObject
{
    Q_OBJECT

public:
    IOptionsPageProvider(QObject *parent = 0) : QObject(parent) {}

    Id category() const { return m_category; }
    QString displayCategory() const { return m_displayCategory; }
    QIcon categoryIcon() const { return QIcon(m_categoryIcon); }

    virtual QList<IOptionsPage *> pages() const = 0;
    virtual bool matches(const QString & /* searchKeyWord*/) const = 0;

protected:
    void setCategory(Id category) { m_category = category; }
    void setDisplayCategory(const QString &displayCategory) { m_displayCategory = displayCategory; }
    void setCategoryIcon(const QString &categoryIcon) { m_categoryIcon = categoryIcon; }

    Id m_category;
    QString m_displayCategory;
    QString m_categoryIcon;
};

} // namespace Core

#endif // IOPTIONSPAGE_H

搜索框使用索引来记录每个添加的选项页面的子页面的所有标题/标签。

bool Core::IOptionsPage::matches(const QString &searchKeyWord) const
{
    if (!m_keywordsInitialized) {
        IOptionsPage *that = const_cast<IOptionsPage *>(this);
        QWidget *widget = that->widget();
        if (!widget)
            return false;
        // find common subwidgets
        foreach (const QLabel *label, widget->findChildren<QLabel *>())
            m_keywords << label->text();
        foreach (const QCheckBox *checkbox, widget->findChildren<QCheckBox *>())
            m_keywords << checkbox->text();
        foreach (const QPushButton *pushButton, widget->findChildren<QPushButton *>())
            m_keywords << pushButton->text();
        foreach (const QGroupBox *groupBox, widget->findChildren<QGroupBox *>())
            m_keywords << groupBox->title();

        // clean up accelerators
        QMutableStringListIterator it(m_keywords);
        while (it.hasNext())
            it.next().remove(QLatin1Char('&'));
        m_keywordsInitialized = true;
    }
    foreach (const QString &keyword, m_keywords)
        if (keyword.contains(searchKeyWord, Qt::CaseInsensitive))
            return true;
    return false;
}

找到原始对话框的其余组件可能需要一些时间,但这是可行的。

包含的示例

Qt Creator &gt; Welcome (tab) &gt; Examples 中,复杂设置对话框的最佳选择可能是:

选项卡对话框示例

http://doc.qt.io/qt-5/qtwidgets-dialogs-tabdialog-example.html

永久设置

QSettings 可能是存储设置的最佳选择。其他选项包括XMLJSON。 Qt 5 很好地实现了JSON

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多