我想弄一个公用的弹窗类,如何让它能被共用呢?

王桑的一天 2020-09-02 01:18:03
我想弄一个公用的弹窗类,里面有一些函数,弹出不同的QMessageBox,显示不同的提示。

然后别的界面可以通过多重继承它,就可以公用这些提示弹窗提示了。

但是发现不行,因为好像有二次继承的问题,都继承自 QWidget/QObject

我应该怎样达到我的目的呢?



...全文
883 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
王桑的一天 2020-09-02
  • 打赏
  • 举报
回复
引用 5 楼 弓人水 的回复:
MainWindow继承 QDialog, MsgHandler ,他们都是继承QWidget,这样MainWindow就重复继承QWidget,典型的菱形继承。 这样就产生二义性的问题了,建议不要设计这样的继承关系。 可以把MsgHandler类似QMessageBox这样使用啊。
写成静态方法是吗?恩我试试
弓人水 2020-09-02
  • 打赏
  • 举报
回复
MainWindow继承 QDialog, MsgHandler ,他们都是继承QWidget,这样MainWindow就重复继承QWidget,典型的菱形继承。
这样就产生二义性的问题了,建议不要设计这样的继承关系。
可以把MsgHandler类似QMessageBox这样使用啊。
王桑的一天 2020-09-02
  • 打赏
  • 举报
回复
最后一个写错了:

//mainwindow.cpp
MainWindow::MainWindow(QWidget *parent)
    : QDialog(parent), MsgHandler(parent)
{
    QVBoxLayout *main_layout = new QVBoxLayout(this); //error: ambiguous conversion from derived class 'MainWindow' to base class 'QWidget':
    setWindowTitle(tr("Test")); //error: non-static member 'setWindowTitle' found in multiple base-class subobjects of type 'QWidget':
}
王桑的一天 2020-09-02
  • 打赏
  • 举报
回复
引用 2 楼 弓人水 的回复:
如果是开发一些通用性很强的弹窗控件,不建议利于派生关系来使用这些弹窗。只需要简单的关联关系就可以了。 就像使用QMessageBox那样使用就可以了。 当然开发这一批通用弹框肯定是继承关系了,一个基类弹框,派生多个各种用途的子弹框。
恩是的,比如我有一个弹窗提示,很多界面都会用到,我想把它提出来公用。 于是我写了一个类,类中有函数,调用函数来显示这弹窗:

// msg_handler.h
class MsgHandler : public QWidget
{
    Q_OBJECT

public:
    MsgHandler(QWidget *parent=nullptr);
    ~MsgHandler();

    void popMsg1();
};


// msg_handler.cpp
MsgHandler::MsgHandler(QWidget *parent)
    : QWidget(parent)
{

}

void MsgHandler::popMsg1()
{
    QMessageBox::critical(this, tr("Error"), tr("There is an error"));
}

MsgHandler::~MsgHandler()
{

}

//mainwindow.h
class MainWindow: public QDialog, public MsgHandler 
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent=nullptr);
    ~MainWindow();

}

//mainwindow.cpp
MainWindow::MainWindow(QWidget *parent)
    : QDialog(parent)
{
    QVBoxLayout *main_layout = new QVBoxLayout(this); //error: ambiguous conversion from derived class 'MainWindow' to base class 'QWidget':
    setWindowTitle(tr("Test")); //error: non-static member 'setWindowTitle' found in multiple base-class subobjects of type 'QWidget':
}
弓人水 2020-09-02
  • 打赏
  • 举报
回复
如果是开发一些通用性很强的弹窗控件,不建议利于派生关系来使用这些弹窗。只需要简单的关联关系就可以了。
就像使用QMessageBox那样使用就可以了。

当然开发这一批通用弹框肯定是继承关系了,一个基类弹框,派生多个各种用途的子弹框。
弓人水 2020-09-02
  • 打赏
  • 举报
回复
QWidget本来就继承于QObject啊,新的派生类只需要继承QWidget就可以了。
发一下类关系看看呢。
弓人水 2020-09-02
  • 打赏
  • 举报
回复
那就让MsgHandler作为类成员,或局部变量,不要继承。
王桑的一天 2020-09-02
  • 打赏
  • 举报
回复
引用 11 楼 管理員 的回复:
[quote=引用 10 楼 管理員 的回复:][quote=引用 9 楼 弓人水 的回复:][quote=引用 8 楼 弓人水 的回复:]简单点,MsgHandler就需要继承QWidget了。


// msg_handler.cpp
MsgHandler::MsgHandler()
{

}

void MsgHandler::popMsg1()
{
    if(QWidget *win = static_cast<QWidget *>(this)) {
        QMessageBox::critical(win, tr("Error"), tr("There is an error"));        
    }
}

MsgHandler::~MsgHandler()
{
}
不需要继承QWidget。。。[/quote] 不继承的话,无法把 this 转为 QWidget 指针的[/quote]

// msg_handler.cpp
MsgHandler::MsgHandler()
{
 
}
 
void MsgHandler::popMsg1()
{
    QWidget w;
    QMessageBox::critical(&w, tr("Error"), tr("There is an error"));        
}
改成这样可以[/quote] 也不行,不继承就不是槽函数了,是普通函数,无法连接信号 。。。
王桑的一天 2020-09-02
  • 打赏
  • 举报
回复
引用 10 楼 管理員 的回复:
[quote=引用 9 楼 弓人水 的回复:][quote=引用 8 楼 弓人水 的回复:]简单点,MsgHandler就需要继承QWidget了。


// msg_handler.cpp
MsgHandler::MsgHandler()
{

}

void MsgHandler::popMsg1()
{
    if(QWidget *win = static_cast<QWidget *>(this)) {
        QMessageBox::critical(win, tr("Error"), tr("There is an error"));        
    }
}

MsgHandler::~MsgHandler()
{
}
不需要继承QWidget。。。[/quote] 不继承的话,无法把 this 转为 QWidget 指针的[/quote]

// msg_handler.cpp
MsgHandler::MsgHandler()
{
 
}
 
void MsgHandler::popMsg1()
{
    QWidget w;
    QMessageBox::critical(&w, tr("Error"), tr("There is an error"));        
}
改成这样可以
王桑的一天 2020-09-02
  • 打赏
  • 举报
回复
引用 9 楼 弓人水 的回复:
[quote=引用 8 楼 弓人水 的回复:]简单点,MsgHandler就需要继承QWidget了。


// msg_handler.cpp
MsgHandler::MsgHandler()
{

}

void MsgHandler::popMsg1()
{
    if(QWidget *win = static_cast<QWidget *>(this)) {
        QMessageBox::critical(win, tr("Error"), tr("There is an error"));        
    }
}

MsgHandler::~MsgHandler()
{

}
不需要继承QWidget。。。[/quote] 不继承的话,无法把 this 转为 QWidget 指针的
弓人水 2020-09-02
  • 打赏
  • 举报
回复
引用 8 楼 弓人水 的回复:
简单点,MsgHandler就需要继承QWidget了。


// msg_handler.cpp
MsgHandler::MsgHandler()
{

}

void MsgHandler::popMsg1()
{
if(QWidget *win = static_cast<QWidget *>(this)) {
QMessageBox::critical(win, tr("Error"), tr("There is an error"));
}
}

MsgHandler::~MsgHandler()
{

}


不需要继承QWidget。。。
弓人水 2020-09-02
  • 打赏
  • 举报
回复
简单点,MsgHandler就需要继承QWidget了。


// msg_handler.cpp
MsgHandler::MsgHandler()
{

}

void MsgHandler::popMsg1()
{
if(QWidget *win = static_cast<QWidget *>(this)) {
QMessageBox::critical(win, tr("Error"), tr("There is an error"));
}
}

MsgHandler::~MsgHandler()
{

}
王桑的一天 2020-09-02
  • 打赏
  • 举报
回复
引用 5 楼 弓人水 的回复:
MainWindow继承 QDialog, MsgHandler ,他们都是继承QWidget,这样MainWindow就重复继承QWidget,典型的菱形继承。 这样就产生二义性的问题了,建议不要设计这样的继承关系。 可以把MsgHandler类似QMessageBox这样使用啊。
呃不对,其实我是想要一堆公共的槽函数,子类可以通过信号槽方式,调用这些槽函数,显示提示消息。 这要怎么做?

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧