为什么我升级的小部件无法使用基类功能?

时间:2015-08-03 00:50:13

标签: c++ qt

我一直在尝试使文本编辑能够使其字体能够与粗体和斜体等一起更改。我尝试通过推广文本编辑和组合框来添加字体方法,但我收到错误C2039' setText'不是编辑'的成员。 textedit的提升小部件类。我在设计师中推广它,为粗体和斜体添加插槽。我设置了基类,但它不能从该类中完成一些基本的东西。我该如何解决这个问题?

editor.h

#ifndef EDITOR_H
#define EDITOR_H
#include <QWidget>
#include <QTextEdit>
class Editor: public QWidget
{
    Q_OBJECT

public:
    explicit Editor(QWidget *parent = 0);
signals:

public slots:

};

#endif // EDITOR_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QMessageBox>
#include <QTextStream>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

}


void MainWindow::on_actionOpen_triggered()
{
        ...
        //Line with error
        ui->texteditor->setText(in.readAll());
        file.close();
    }
}

void MainWindow::on_actionSave_triggered()
{
             ....
            //other line with error
            stream << ui->texteditor->toPlainText();
            stream.flush();
            file.close();
        }
    }
}

3 个答案:

答案 0 :(得分:1)

您的文本编辑器继承了QWidget,而不是QTextEdit。在editor.h文件中,切换到:

/2015/08/03/are-permas-working.html' not found. WEBrick/1.3.1 (Ruby/2.1.6/2015-04-13) at localhost:4000

答案 1 :(得分:1)

如果QTextEdit未从Editor继承,则Editor无法升级为QTextEdit。 Promotion依赖于标准C ++继承。您正在尝试创建一个可用于将功能固定到多个现有窗口小部件类型的公共类。除非您更改要添加功能的小部件的公共基类(可能QWidget),否则这是不可能的。

setItalicsetBold个广告位添加到一组小部件的一些选择是:

  1. 更改Qt源代码,将新功能添加到QTextEditQComboBox
  2. 的公共基类
  3. 为每个要扩展的小部件创建一个新的Editor类,派生自各个类。
  4. 不要依赖继承来解决问题。
  5. 1是一个很糟糕的解决方案,原因很多,所以我甚至都不会谈论它。如果您只想拥有一些要扩展的功能的窗口小部件类型,则2将起作用,否则可能需要大量重复的代码。

    但是,我认为最好的方法是在信号处理程序中做一些额外的工作,无论你想要设置斜体和粗体设置的信号。

    我猜你只是想写作:

    connect(<some_object>, <some_signal>, ui->textEdit, SLOT(setItalic(bool)));
    

    也许不是直接连接,只需编写一个不依赖于setBoldsetItalic的特殊函数的快速函数,而只使用标准的QWidget工具:

    connect(<some_object>, <some_signal>, this, SLOT(on_some_signal()));
    
    //...
    
    void on_some_signal()
    {
        QFont fnt = ui->textEdit->font();
        fnt.setItalic(true);
        ui->textEdit->setFont(fnt);
    }
    

答案 2 :(得分:0)

要创建一个可以为许多其他类提供功能的bolt-on类,您可以使用模板系统:

class BoltOnBase {
  QWidget * const m_base;
  explicit BoltOnBase(QWidget * base) : m_base(base) { ... }
  ...
  // things that don't depend on the underlying widget type
};

template <class Base>
class BoltOn : public Base, public BoltOnBase {
  ...
pulic:
  BoltOn(QWidget * parent = 0) : Base(parent), BoltOnBase(this) {}
  ...
};

...
BoltOn<QTextEditor> myEditor;