gpt4 book ai didi

c++ - 为什么我升级的小部件不能使用基类函数?

转载 作者:行者123 更新时间:2023-11-28 02:22:47 25 4
gpt4 key购买 nike

我一直在尝试使文本编辑能够使其字体能够随粗体和斜体等内容一起更改。我试图通过提升文本编辑和组合框来添加字体方法来做到这一点,但我收到错误 C2039 'setText' 不是 'Editor' 的成员,提升了 textedit 的小部件类。我在设计师中推广它以添加用于粗体和斜体的插槽。我设置了基类,但它无法执行该类的一些基本操作。我该如何解决这个问题?

编辑器.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

主窗口.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();
}
}
}

最佳答案

如果 Editor 没有继承自 QTextEdit,则 QTextEdit 无法提升为 Editor。提升依赖于标准的 C++ 继承。您正在尝试创建一个通用类,该类可用于将功能附加到多个现有的小部件类型。这是不可能的,除非您更改要向其添加功能的小部件的公共(public)基类(可能是 QWidget)。

setItalicsetBold 插槽添加到一组小部件的一些选择是:

  1. 更改 Qt 源代码以将新功能添加到 QTextEditQComboBox 的公共(public)基类中
  2. 为每个要扩展的小部件创建一个新的 Editor 类,该类派生自每个相应的类。
  3. 不要依赖继承来解决问题。

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);
}

关于c++ - 为什么我升级的小部件不能使用基类函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31778057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com