【问题标题】:comparison between QAbstractButton and QPushButton* lacks a castQAbstractButton 和 QPushButton* 之间的比较缺少演员表
【发布时间】:2015-04-15 11:55:13
【问题描述】:

我的代码如下所示。当我尝试编译它时,我得到:

错误:29:38 不同指针类型 QAbstractButton 和 QPushButton* 之间的比较缺少强制转换 -> 'if (stdmetBox.clickedButton() == stdButton)'

系统:Amazon Kindle Fire 7" 运行 Cyanogenmod 11.0 (Android 4.4.2 Kitkat) 编译器:G++/GCC(GCC for C4droid 插件版本 4.9.1) IDE:带有 SDL、GCC 和 Ministro 插件的 C4droid

任何帮助将不胜感激。我已经搜索过,但我能找到的唯一实例是 iOS 特定的。

#include <fstream>
#include <QApplication>
#include <QLabel>
#include <QMessageBox>
#include <QString>
#include <QAbstractButton>
#include <QInputDialog>
#include <QDebug>

using namespace std;

int setup() 
{
    string unitchar;
    string unitcharo;
    bool setupSuccess;
    int returncode;
    QMessageBox msgBox;
    QMessageBox stdmetBox;
    QMessageBox ynBox;

    msgBox.setText("Welcome to Tyler's Fitness App! This app will help you with your fitness goals, whatever they may be. Let's get you set up!");
    msgBox.exec();

    QPushButton *stdButton = stdmetBox.addButton(QT_TR_NOOP("Standard"), QMessageBox::ActionRole);
    QPushButton *metButton = stdmetBox.addButton(QT_TR_NOOP("Metric"), QMessageBox::ActionRole);                                                
    stdmetBox.exec();

    if (stdmetBox.clickedButton() == stdButton)
    {
        unitchar = "standard";
        unitcharo = "metric";
    }
    else if (stdmetBox.clickedButton() == metButton)
    {
        unitchar = "metric";
        unitcharo = "standard";
    }
    else
    {
        setupSuccess = false;
        returncode = 0;
        return returncode; 
    }

    if (unitchar == "standard")
    {
        ynBox.setInformativeText("Standard units include feet, miles, mph, pounds, etc.");
    }
    else 
    {
        ynBox.setInformativeText("Metric units include meters, kilometers, kph, kilograms, etc.");
    } 

    QPushButton *yesButton = ynBox.addButton(QT_TR_NOOP("Yes"), QMessageBox::ActionRole);
    QPushButton *noButton = ynBox.addButton(QT_TR_NOOP("No"), QMessageBox::ActionRole);
    ynBox.setText("Is that okay?")
    while (ynBox.clickedButton() == noButton)
    {
        if (unitchar == "standard")
        {
            unitchar = "metric";
            unitcharo = "standard";
        }
        else 
        {
            unitchar = "standard";
            unitcharo = "metric";
        }
        if (unitchar == "standard")
        {
            ynBox.setInformativeText("Standard units include feet, miles, mph, pounds, etc.");
        }
        else 
        {
            ynBox.setInformativeText("Metric units include meters, kilometers, kph, kilograms, etc.");
        }
        result = ynBox.exec();
    }

    if (unitchar == "standard")
    {
        msgBox.setText("Great! You've selected standard units.");
        msgBox.exec();
        setupSuccess = true;

    }
    else 
    {
        msgBox.setText("Great! You've selected metric units.");
        msgBox.exec();
        setupSuccess = true;
    }

    if (setupSuccess != true)
    {
        returncode = 0;
    }
    else if (unitchar == "standard")
    {
        returncode = 1;
    }
    else
    {
        returncode = 2;
    }
    return returncode;                      
}                       

int main(int argc, char* argv[])
{ 
    QApplication app(argc, argv);  
    unitmaster = setup();
    if ((unitmaster == 1) || (unitmaster == 2))
    {
        QMessageBox successBox;
        successBox.setText("The program has completed successfully!");
        successBox.exec();
    }
    else 
    {
        QMessageBox errorBox;
        errorBox.setText("The program has completed successfully!");
        errorBox.exec();
    }            
    return app.exec();
}

【问题讨论】:

  • 您似乎忘记了包含&lt;QPushButton&gt;,即使您以需要定义的方式使用QPushButton。其中一个标头必须声明它,因为它被识别为一个类,但如果它不完整,那么编译器将不知道QPushButton* 可以转换为QAbstractButton*。尝试添加缺少的包含,看看是否能解决您的问题。
  • 我继续并将其发布为答案,因为即使我无法测试自己,我也很有信心这是您的问题。

标签: android c++ qt gcc


【解决方案1】:

您似乎忘记了包含&lt;QPushButton&gt;,即使您以需要定义的方式使用QPushButton。其中一个标头必须声明它,因为它被识别为一种类型,但如果它不完整,那么编译器将不知道 QPushButton* 可以转换为 QAbstractButton*

作为一般规则,请始终包含定义您使用的类型的标头,除非您确定声明就足够了。到基指针的隐式转换是需要定义的。

【讨论】:

  • 优秀。简洁的答案解决了我的问题。明确地说,我添加了#include ,程序编译并运行成功。感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 2017-06-09
  • 1970-01-01
  • 2018-06-19
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多