【问题标题】:Setting up a Qt::MainWindow设置 Qt::MainWindow
【发布时间】:2013-03-06 15:52:28
【问题描述】:

所以我对 ruby​​ qt 是 100% 的新手,我已经习惯了 python,而且我已经掌握了基础知识,但是因为 QMenuBar 不能与 Qt::Widget 正确对齐,所以我一直在尝试找出 QMainWindow 命令。我知道你告诉我的那一秒就像 1000% 容易,但是 .setCentralWidget 命令似乎不适用于 ruby​​,所以我只是迷路了......

这是我的“测试”代码,如果你遇到问题,你真的不需要这个,但如果我不把它放出来,有些人会像 wherreee yourrr codddee 一样!!!没看懂?

    require 'Qt'

    class Window < Qt::Widget

        slots 'slotAbout()', 'slotExit()', 'slotNew()'


        def initialize(parent = nil)
            super(parent)

    #menubar part 

            @menubar = Qt::MenuBar.new(self)
            @menubar.setObjectName('menubar')
            @menuFile = Qt::Menu.new(@menubar)
            @menuFile.setObjectName('menuFile')
            @menuFile.setTitle('File')
            @menuHelp = Qt::Menu.new(@menubar)
            @menuHelp.setObjectName('menuHelp')
            @menuHelp.setTitle('&Help')
            @actionNew = Qt::Action.new(self)
            @actionNew.setObjectName('actionNew')
            @actionNew.setText('New')
            @actionExit = Qt::Action.new(self)
            @actionExit.setObjectName('actionExit')
            @actionExit.setText('Exit')
            @actionAbout = Qt::Action.new(self)
            @actionAbout.setObjectName('actionAbout')
            @actionAbout.setText('About')
            @menubar.addAction(@menuFile.menuAction())
            @menubar.addAction(@menuHelp.menuAction())
            @menuFile.addAction(@actionNew)
            @menuFile.addAction(@actionExit)
            @menuHelp.addAction(@actionAbout)
            @text = Qt::LineEdit.new
            @textbox.setStyleSheet "QWidget { color : #f52c01 }" 
            @textbox.setStyleSheet "QWidget { color : #009600 }" 
            @text.setStyleSheet "QWidget { color : black }"
            @text.setText(tr("Somthing"))

            connect(@actionExit, SIGNAL('triggered()'), self, SLOT('slotExit()'))
            connect(@actionNew, SIGNAL('triggered()'), self, SLOT('slotNew()'))
            connect(@actionAbout, SIGNAL('triggered()'), self, SLOT('slotAbout()'))

    #causes some bugs        
    #        statusbar = Qt::StatusBar.new(self)
    #        statusbar.setObjectName('statusbar')

    #examples of groups
            oneGroup =  Qt::GroupBox.new(tr("GroupOne"))
            oneLabel = Qt::Label.new(tr("One"))

            twoGroup =  Qt::GroupBox.new(tr("GroupTwo"))
            twoLabel = Qt::Label.new(tr("One, I mean two!"))
            twoslider = Qt::Slider.new(Qt::Horizontal)
            twoslider.setRange(0, 5)
            twoslider.setValue(0)

    #connecting objects to slots        
    #        connect(onething, SIGNAL('thing(int)'), self, SLOT('slotAbout( int )'))

    #layout set up using groups        
            oneLayout = Qt::GridLayout.new
            oneLayout.addWidget(oneLabel, 0, 0)
            oneLayout.addWidget(@text, 1, 0)
            oneGroup.layout = oneLayout

            twoLayout = Qt::GridLayout.new
            twoLayout.addWidget(twoLabel, 0, 0)
            twoLayout.addWidget(twoslider, 1, 0)
            twoGroup.layout = twoLayout

            layout = Qt::VBoxLayout.new
            layout.addWidget(@menubar)
            layout.addWidget(oneGroup)
            layout.addWidget(twoGroup)
            setLayout(layout)

            setWindowTitle(tr("Main Title"))
        end

        def slotExit()
          app.exec
        end

        def slotAbout()
          Qt::MessageBox.about(self, tr("About Recent Files"), tr("Weeeaaalllll thar theaes fear-es that make thes that which happen, well just karda happen."))
        end

        def slotNew()
          other = Window.new
          other.show()
        end

    end

    app = Qt::Application.new(ARGV)
    window = Window.new
    window.show
    app.exec

【问题讨论】:

  • 我之前尝试过实现它,但我得到的只是一条错误消息,上面写着“正在尝试在窗口“”上设置 QLayout“”,它已经有一个布局。”这就是我在 Qt::MainWindow 尝试之前发布的原因。

标签: ruby user-interface qt4 qtruby


【解决方案1】:

找到了一个很棒的模板,希望对讨厌 ruby​​ 文档的新手有帮助。

    require 'Qt4'
    class Ui_MainWindow

          def setupUi(mainWindow)    
          mainWindow.setObjectName("mainWindow")    
          @font = Qt::Font.new    
          @font.setPointSize(14)    
          mainWindow.setFont(@font)    
          @centralwidget = Qt::Widget.new(mainWindow)    
          @centralwidget.setObjectName("centralwidget")    
          @qgridLayout = Qt::GridLayout.new(@centralwidget)    
          @qgridLayout.setObjectName("qgridLayout")    
          @label = Qt::Label.new(@centralwidget)    
          @label.setObjectName("label")    
          @label.setAlignment(Qt::AlignCenter)    
          @qgridLayout.addWidget(@label, 0, 0, 1, 1)   
          mainWindow.setCentralWidget(@centralwidget)    
          @menubar = Qt::MenuBar.new(mainWindow)    
          @menubar.setObjectName("menubar")    
          @menubar.setGeometry(Qt::Rect.new(0, 0, 517, 35))    
          mainWindow.setMenuBar(@menubar)    
          @statusbar = Qt::StatusBar.new(mainWindow)    
          @statusbar.setObjectName("statusbar")    
          mainWindow.setStatusBar(@statusbar)    
          @dockWidget = Qt::DockWidget.new(mainWindow)    
          @dockWidget.setObjectName("dockWidget")    
          @dockWidget.setAutoFillBackground(false)    
          @dockWidget.setAllowedAreas(Qt::TopDockWidgetArea)    
          @dockWidgetContents = Qt::Widget.new(@dockWidget)    
          @dockWidgetContents.setObjectName("dockWidgetContents")    
          @qgridLayout1 = Qt::GridLayout.new(@dockWidgetContents)    
          @qgridLayout1.setObjectName("qgridLayout1")    
          @label_2 = Qt::Label.new(@dockWidgetContents)    
          @label_2.setObjectName("label_2")    
          @label_2.setAlignment(Qt::AlignCenter)    
          @qgridLayout1.addWidget(@label_2, 0, 0, 1, 1)    
          @dockWidget.setWidget(@dockWidgetContents)    
          mainWindow.addDockWidget(4, @dockWidget)    
          @dockWidget_2 = Qt::DockWidget.new(mainWindow)    
          @dockWidget_2.setObjectName("dockWidget_2")    
          @dockWidget_2.setAllowedAreas(Qt::LeftDockWidgetArea)    
          @dockWidgetContents_2 = Qt::Widget.new(@dockWidget_2)    
          @dockWidgetContents_2.setObjectName("dockWidgetContents_2")    
          @qgridLayout2 = Qt::GridLayout.new(@dockWidgetContents_2)    
          @qgridLayout2.setObjectName("qgridLayout2")    
          @label_3 = Qt::Label.new(@dockWidgetContents_2)    
          @label_3.setObjectName("label_3")    
          @label_3.setAlignment(Qt::AlignCenter)    
          @qgridLayout2.addWidget(@label_3, 0, 0, 1, 1)    
          @dockWidget_2.setWidget(@dockWidgetContents_2)    
          mainWindow.addDockWidget(1, @dockWidget_2)    
          @dockWidget_3 = Qt::DockWidget.new(mainWindow)    
          @dockWidget_3.setObjectName("dockWidget_3")    
          @dockWidget_3.setAllowedAreas(Qt::RightDockWidgetArea)    
          @dockWidgetContents_3 = Qt::Widget.new(@dockWidget_3)    
          @dockWidgetContents_3.setObjectName("dockWidgetContents_3")    
          @qgridLayout3 = Qt::GridLayout.new(@dockWidgetContents_3)    
          @qgridLayout3.setObjectName("qgridLayout3")    
          @label_4 = Qt::Label.new(@dockWidgetContents_3)    
          @label_4.setObjectName("label_4")    
          @label_4.setAlignment(Qt::AlignCenter)    
          @qgridLayout3.addWidget(@label_4, 0, 0, 1, 1)    
          @dockWidget_3.setWidget(@dockWidgetContents_3)    
          mainWindow.addDockWidget(2, @dockWidget_3)    
          @dockWidget_4 = Qt::DockWidget.new(mainWindow)    
          @dockWidget_4.setObjectName("dockWidget_4")    
          @dockWidget_4.setAllowedAreas(Qt::BottomDockWidgetArea)    
          @dockWidgetContents_4 = Qt::Widget.new(@dockWidget_4)    
          @dockWidgetContents_4.setObjectName("dockWidgetContents_4")    
          @qgridLayout4 = Qt::GridLayout.new(@dockWidgetContents_4)    
          @qgridLayout4.setObjectName("qgridLayout4")    
          @label_5 = Qt::Label.new(@dockWidgetContents_4)    
          @label_5.setObjectName("label_5")    
          @label_5.setAlignment(Qt::AlignCenter)    
          @qgridLayout4.addWidget(@label_5, 0, 0, 1, 1)    
          @dockWidget_4.setWidget(@dockWidgetContents_4)   
          mainWindow.addDockWidget(8, @dockWidget_4)    
          retranslateUi(mainWindow);    
          size = Qt::Size.new(517, 391)    
          size = size.expandedTo(mainWindow.minimumSizeHint())    
          mainWindow.resize(size)    
          Qt::MetaObject.connectSlotsByName(mainWindow)    
          end 
          # setupUi    
          def retranslateUi(mainWindow)    
          mainWindow.setWindowTitle(Qt::Application.translate("MainWindow", "Example 2", nil, Qt::Application::UnicodeUTF8))    
          @label.setText(Qt::Application.translate("MainWindow", "Central Widget", nil, Qt::Application::UnicodeUTF8))    
          @label_2.setText(Qt::Application.translate("MainWindow", "Top Docking Area", nil, Qt::Application::UnicodeUTF8))    
          @label_3.setText(Qt::Application.translate("MainWindow", "Left Docking Area", nil, Qt::Application::UnicodeUTF8))    
          @label_4.setText(Qt::Application.translate("MainWindow", "Right Docking Area", nil, Qt::Application::UnicodeUTF8))    
          @label_5.setText(Qt::Application.translate("MainWindow", "Bottom Docking Area", nil, Qt::Application::UnicodeUTF8))    
          end 
    # retranslateUi
    end
    module Ui    
          class MainWindow < Ui_MainWindow    
          end
    end  
    # module Ui
    if $0 == __FILE__    
            a = Qt::Application.new(ARGV)    
            u = Ui_MainWindow.new
            w = Qt::MainWindow.new
            u.setupUi(w)
            w.show
            a.exec
    end

【讨论】:

    【解决方案2】:

    所以与 setCentralWidget 有点混淆的是你需要传递一个 Qt::Widget 并且传递一个 Qt::Layout 会给你一个 NoMethodError。我认为这似乎有点违反直觉,因为大多数人都想为他们的第一个基本 GUI 设置网格、hbox 或 vbox 布局。

    将小部件设置为中心小部件后,您可以调用

    yourCentralWidget.layout = yourNewLayout
    

    并将您想要的任何布局设置为主窗口。希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-10
      • 2013-08-27
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      相关资源
      最近更新 更多