在列表中使用QWidget指针时,无法显示它们

时间:2014-08-04 15:37:33

标签: c++ qt

我在我的电脑上创建了一个日历程序,但是我在创建一个Widget来显示Day-details时遇到了一个非常奇怪的问题。

它应该显示的是顶部的选定日期,前一个和下一个按钮,以及一个QPushButton-子类的列表,间隔为1小时,但由于某种原因,我只能获得所选日期+之前的日期按钮+当我尝试运行它时的下一个按钮。

小部件指针放在列表中似乎是一个问题,但对我来说这似乎很奇怪,这是一个问题。但是当我测试不使用列表并对其工作的所有内容进行硬编码时,为什么我将这些指针放在列表中是一个问题呢?

GUICalendarDay::GUICalendarDay(QDate date)
{
    m_date = date;
    //creating buttons
    m_prevDay = new QPushButton(QString("<"));
    m_nextDay = new QPushButton(QString(">"));

    connect(m_nextDay, SIGNAL(clicked()), this, SLOT(nextDay()));
    connect(m_prevDay, SIGNAL(clicked()), this, SLOT(prevDay()));

    //creating the cells
    for(int i = 0; i++; (i<TOTALHOURS))
    {
        m_shedule[i] = new GUICalendarCell(QTime(i, 0, 0), QTime(i, 59, 59));//creating 1-hour intervals
        connect(m_shedule[i], SIGNAL(clickedRange(QTime,QTime)), this, SLOT(selectedRange(QTime,QTime)));
    }

    //creating the labels
    m_dateLabel = new QLabel(m_date.toString(QString("dd/MM/yyyy")));

    QLabel *hourLabel[TOTALHOURS];

    for(int i = 0; i++; (i<TOTALHOURS))
    {
        hourLabel[i] = new QLabel(QTime(i,0,0).toString(QString("hh:mm")));
    }


    //placing everything in a layout
    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget(m_prevDay, 0, 1);
    mainLayout->addWidget(m_dateLabel, 0, 2);
    mainLayout->addWidget(m_nextDay, 0, 3);
    for(int i = 0; i++; (i<TOTALHOURS))
    {
        mainLayout->addWidget(hourLabel[i], i+1, 0);
        hourLabel[i]->show();
        mainLayout->addWidget(m_shedule[i], i+1, 1, 3, 1);
        m_shedule[i]->show();
    }
    setLayout(mainLayout);

}

这不是一个非常大的问题,但我想保持我的代码干净,我也想知道为什么这不起作用。

Everything I see

1 个答案:

答案 0 :(得分:2)

您已使用上一个for循环中的循环测试切换了循环增量。它应该是for (int i = 0; i < TOTALHOURS; ++)

您的代码还有其他一些样式问题。

  1. 使用容器类,而不是原始数组。

  2. 您可以将所有成员放入类中,而不是将它们显式存储在堆上。

  3. 您可以使用PIMPL使标头不包含实施细节。

  4. 以下示例需要C ++ 11和Qt 5.可以通过Q_PRIVATE_SLOT使用它来适应Qt 4和C ++ 9x。

    // Interface (header file)
    
    #include <QWidget>
    
    class QDate;
    class GUICalendarDayPrivate;
    class GUICalendarDay : public QWidget {
       Q_OBJECT
       Q_DECLARE_PRIVATE(GUICalendarDay)
       QScopedPointer<GUICalendarDayPrivate> const d_ptr;
    public:
       explicit GUICalendarDay(const QDate & date, QWidget * parent = 0);
       ~GUICalendarDay();
    };
    
    // Implementation (.cpp file)
    
    #include <QGridLayout>
    #include <QPushButton>
    #include <QLabel>
    #include <QDate>
    
    // dummy to make the example compile
    class GUICalendarCell : public QWidget {
       Q_OBJECT
    public:
       explicit GUICalendarCell(const QTime &, const QTime &, QWidget * parent = 0) : QWidget(parent) {}
       Q_SIGNAL void clickedRange(const QTime &, const QTime &);
    };
    
    class GUICalendarDayPrivate {
    public:
       QDate date;
       QGridLayout layout;
       QPushButton prevDay, nextDay;
       QLabel dateLabel;
       QList<GUICalendarCell*> schedule;
    
       QList<QLabel*> hourLabels;
       explicit GUICalendarDayPrivate(const QDate &, QWidget * parent);
       void onNextDay() {}
       void onPrevDay() {}
       void selectedRange(const QTime &, const QTime &) {}
    };
    
    GUICalendarDay::GUICalendarDay(const QDate &date, QWidget *parent) : QWidget(parent),
       d_ptr(new GUICalendarDayPrivate(date, this))
    {}
    
    GUICalendarDay::~GUICalendarDay() {}
    
    GUICalendarDayPrivate::GUICalendarDayPrivate(const QDate & date_, QWidget * parent) :
       date(date_),
       layout(parent),
       prevDay("<"), nextDay(">"), dateLabel(date.toString(QString("dd/MM/yyyy")))
    {
       const int TOTALHOURS = 24;
       QObject::connect(&nextDay, &QAbstractButton::clicked, [this]{ onNextDay(); });
       QObject::connect(&prevDay, &QAbstractButton::clicked, [this]{ onPrevDay(); });
    
       layout.addWidget(&prevDay, 0, 1);
       layout.addWidget(&dateLabel, 0, 2);
       layout.addWidget(&nextDay, 0, 3);
    
       for(int i = 0, row = layout.rowCount(); i<TOTALHOURS; ++i, ++row) {
          auto from = QTime(i, 0, 0), to = QTime(i, 59, 59);
          auto cell = new GUICalendarCell(from, to);
          auto hourLabel = new QLabel(from.toString(QString("hh:mm")));
    
          QObject::connect(cell, &GUICalendarCell::clickedRange,
                           [this](const QTime & from, const QTime & to){
             selectedRange(from, to);
          });
    
          schedule << cell;
          hourLabels << hourLabel;
          layout.addWidget(hourLabel, row, 0);
          layout.addWidget(cell, row, 1, 3, 1);
       }
    }
    
    // main.cpp
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
       QApplication a(argc, argv);
       GUICalendarDay day(QDate::currentDate());
       day.show();
       return a.exec();
    }
    
    // Only needed if all of the example is in a single file
    #include "main.moc"