2013-03-06 200 views
3

所以我對ruby qt 100%是新手,我已經習慣了python,並且我已經掌握了基礎知識,但是因爲QMenuBar不會正確對齊Qt :: Widget,我一直在嘗試找出QMainWindow命令。我知道它像1000%容易第二你告訴我,但.setCentralWidget命令似乎不工作的紅寶石,所以我只是失去了...設置一個Qt :: MainWindow

這是我的「測試」代碼,如果你真的得到你的問題不需要這個,但如果我不把它放在一些人會像你的孩子一樣!我沒有明白嗎?

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 
+0

我已經嘗試過實施它,但我可以得到的是一個錯誤消息,說「試圖設置QLayout」「窗口」「,已經有一個佈局。」這就是爲什麼我之前發佈我的Qt :: MainWindow嘗試。 – 2013-03-06 15:54:55

回答

2

找到一個很好的模板,希望這有助於任何討厭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 
0

所以這是setCentralWidget有點混亂的事情是,你需要傳遞一個Qt ::小部件,它傳遞一個Qt ::佈局會給你一個NoMethodError。我認爲這似乎有一點直觀,因爲大多數人想要爲其第一個基本GUI設置網格,hbox或vbox佈局。

一旦你設置你的widget爲中心的小部件,你可以撥打

yourCentralWidget.layout = yourNewLayout 

和該組任何佈局要作爲主窗口。我希望這有助於!