【问题标题】:How to remove the default menu on the left side of the title bar - Qt?如何删除标题栏左侧的默认菜单-Qt?
【发布时间】:2012-02-15 12:11:00
【问题描述】:
    Qt :: WindowFlags flags = 0;

    // Makes the Pomodoro stay on the top of all windows.
    flags |= Qt :: WindowStaysOnTopHint;

    // Removes minimize, maximize, and close buttons.
    flags |= Qt :: WindowTitleHint | Qt :: CustomizeWindowHint;

    window->setWindowFlags (flags);
    window->setWindowTitle ("Failing to plan is planning to fail");

这会删除最小化、最大化和关闭按钮。左侧的默认菜单仍然存在。如何摆脱它?

我希望标题栏在那里,但只想删除菜单。

默认菜单包含:最小化、最大化、移动等选项。

编辑 1:

timer.cpp

#include <QApplication>
#include <QMainWindow>
#include "timer.h"

#include <QPushButton>
#include <QListWidget>
#include <QtGui>
#include <QTreeWidget>
int main(int argc, char *argv[])
{
    QApplication    app (argc, argv);

    // The window on which we will place the timer.
    QMainWindow *window           = new QMainWindow();
    QWidget           *centralWidget = new QWidget (window);

    /* Button widget */
    // Displays a button on the main window.
    QPushButton   *startButton     = new QPushButton("Start", window);
    // Setting the size of the button widget.
    startButton->setFixedSize (245, 25);

    /* Text box */
    // Displays a time interval list on the main window.
    QListWidget *timeIntervalList = new QListWidget (window);
    timeIntervalList->setFixedSize (30, 145);

    QStringList timeIntervals;
    timeIntervals << "1" << "20" << "30" << "40";
    timeIntervalList->addItems (timeIntervals);

    /* LCD widget */
    // Start Counting down from 25 minutes
    lcdDisplay *objLcdDisplay = new lcdDisplay (centralWidget);
    // Setting the size of the LCD widget.
    objLcdDisplay->setFixedSize (245, 140);

    // The clicked time interval should be returned from the list to the timer.
    QObject :: connect (timeIntervalList, SIGNAL (itemClicked (QListWidgetItem *)), objLcdDisplay, SLOT (receiveTimeInterval (QListWidgetItem *)));

    // The timer should start and emit signals when the start button is clicked.
    QObject :: connect (startButton, SIGNAL (clicked ()), objLcdDisplay, SLOT (setTimerConnect ()));

    *************************************************************************
    Qt :: WindowFlags flags = 0;
    // Makes the Pomodoro stay on the top of all windows.
    flags |= Qt :: Window | Qt :: WindowStaysOnTopHint;
    // Removes minimize, maximize, and close buttons.
    flags |= Qt :: WindowTitleHint | Qt :: CustomizeWindowHint;
    window->setWindowFlags (flags);
    *************************************************************************
    window->setWindowTitle   ("Failing to plan is planning to fail");

    QGridLayout *layout = new QGridLayout();
    centralWidget->setLayout(layout);

    //Add Items to QGridLayout Here 
    //Row and Column counts are set Automatically
    layout->addWidget (objLcdDisplay, 0, 1);
    layout->addWidget (startButton, 1, 1);
    layout->addWidget (timeIntervalList, 0, 0);

    window->setCentralWidget (centralWidget);
    window->show();

    return app.exec();
}

定时器.h

#ifndef  LCDNUMBER_H
#define LCDNUMBER_H

#include <QLCDNumber>
#include <QTimer>
#include <QTime>
#include <QListWidget>
#include <QMessageBox>
#include <iostream>

class lcdDisplay : public QLCDNumber
{
    Q_OBJECT  

    public:
        // The QTimer class provides repetitive and single-shot timers.
        QTimer* objTimer;
        // The QTime class provides clock time functions.
        QTime*  objTime;

    public:
        lcdDisplay (QWidget *parentWidget)
        {
            objTimer = new QTimer ();
            // Setting our own time with the specified hours, minutes, and seconds.
            objTime  = new QTime  (0, 0, 0);

            setParent (parentWidget);
        };

        ~ lcdDisplay () {};

    public slots:
        // This slot is called after the timer timeouts (1 second).
        void setDisplay ()
        {
            // TODO
            objTime->setHMS (0, objTime->addSecs (-1).minute (), objTime->addSecs (-1).second ());
            display (objTime->toString ());

            if ((objTime->minute () == 0) && (objTime->second () == 0)) 
            {
                objTimer->stop ();
                QMessageBox msgBox;
                msgBox.setWindowTitle ("Pomodoro");
                msgBox.setText ("Time's up.");
                msgBox.setWindowModality(Qt::ApplicationModal);
                msgBox.exec();
            }
        };

        void receiveTimeInterval (QListWidgetItem *item)
        {
            QString h = item->text();
            objTime->setHMS (0, h.toUInt(), 0);
        }

        void setTimerConnect ()
        {
            // connect (objectA, signalAFromObjectA, objectB, slotAFromObjectB)
            // timeout (): This signal is emitted when the timer times out. The time out period can be specified with `start (int milliseconds)` function.
            QObject :: connect (objTimer, SIGNAL (timeout ()), this, SLOT (setDisplay ()));

            // 1 second has 1000 milliseconds.
            // start (int milliseconds): Starts the timer with a timeout interval of specified milliseconds. this means that after 1 second the timer will emit a signal. TODO placement
            objTimer->start (1000);
        }
};
#endif

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    这对我有用:

    Qt::Window | Qt::WindowTitleHint | Qt::WindowStaysOnTopHint | Qt::CustomizeWindowHint
    

    有时您必须在窗口的构造函数中指定它们才能生效。如果您稍后分配它们 (setWindowFlags),某些设置可能不适用。

    【讨论】:

      【解决方案2】:

      我目前在没有 Qt 环境的情况下工作,所以我无法对其进行测试。你能试试这个吗?

      Qt::WindowFlags flags = 0;
      
      // Makes the Pomodoro stay on the top of all windows.
      flags |= Qt :: WindowStaysOnTopHint;
      
      // Removes minimize, maximize, and close buttons.
      flags |= Qt :: WindowTitleHint | Qt :: CustomizeWindowHint;
      
      window->setWindowFlags (flags & ~Qt::WindowSystemMenuHint);
      window->setWindowTitle ("Failing to plan is planning to fail");
      

      【讨论】:

      • 对不起。 :( 没有帮助。菜单还在。
      • 好的,我回家看看。
      • 好的,我检查了它,对我来说它可以工作,因为你已经在你的问题中发布了它。你的窗口的基类是什么?
      • 您能提供您的完整代码,以便我可以在我的计算机上进行测试吗?你在 Windows 上吗?我在 Linux 上。
      【解决方案3】:

      尝试从设置 Qt::Dialog 开始

      setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowStaysOnTopHint);
      

      【讨论】:

      • 这只是将窗口移动到屏幕的中心,对菜单没有做任何事情:(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 2017-05-29
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多