2015-07-03 50 views
2

對於那些在.NET Framework中使用UserControl組件(在我看來是最熱門的框架)非常熟悉C#或VB.NET的人,您已習慣於添加多個按鈕該預覽不同用戶控件如下:在QWindow中對接現有的QWidget

1)首先,準備將適當的用戶界面(包含3個按鈕,右側區域中的單個面板點擊添加按鈕中的一個)之後,以查看每個用戶控制。

2)添加3個用戶從該溶液中資源管理器)插入各用戶控件中的內容),用於在frmMain的3個按鈕實現代碼控制...

3 ...

4。 CS爲以下(此實現,我們將實施「歡迎」按鈕承載對象名稱爲welcomeBtn,其餘的將具有相同的代碼,但不同的用戶控件的名稱代替):

private void welcomeBtn_Click(object sender, EventArgs e) 
{ 
    //Clear up everything from the panel if any item exist(s)... 
    mainPanel.Controls.Clear(); 

    //Create a new instance of a user control for the button... 
    UserControl1_Welcome welcome = new UserControl1_Welcome(); 

    //Show up the created instance of the user control 
    mainPanel.Controls.Add(welcome); 
} 

5)最後,該計劃將首先運行時,最終是這樣的:

http://i.stack.imgur.com/OENwG.png

**程序的使用**

當你點擊例如「歡迎光臨」按鈕,結果應該期望是這樣的:

http://i.stack.imgur.com/iCyo3.png

...當你點擊不同的按鈕,讓說,「許可證銀reement「按鈕,你會希望看到一些不同於你當前的選擇。

主要問題 我們如何能夠通過應用「QDockWidget」把Windows窗體的Qt Creator中的簡單?

我都試過,沒有任何問題插入QDockWidget成分,但是當我嘗試添加QWidget的的QDockWidget內做相當於.NET代碼:

ui->dockWidget->setWidget(myWidget); 

我認爲這是相當於該行在C#.NET(糾正我,如果我錯了這裏)代碼:

ui.Controls.Add(myWidget); 

使用此代碼後,我的計劃會不會崩潰,也沒有任何顯示運行...

P.S.對不起了鏈接圖片,我沒有爲使他們出現10聲譽......

+0

這不是一個QDockWidget,但3 QPushButton和1周的QTextEdit ... – Miki

+0

@Miki我並不想問如何添加QPushButton和QTextEdit,我已經在C#中使用這些術語來填充每個用戶控件中的一些內容。我想要的是有一個與C#示例(通過單擊按鈕顯示用戶控件)完成同樣功能的程序。 –

+0

看到這個(如果你還沒有)http://doc.qt.io/qt-4.8/qt-mainwindows-dockwidgets-example.html – Miki

回答

1

我要的是有一個程序,與C#示例(基於單擊按鈕顯示用戶控件)做同樣的事情。

如果您想根據點擊一個按鈕來顯示特定部件,我建議使用QStackedWidget 一個簡單的例子是這樣的:

// In the constructor of your CustomWidget 

// Create your buttons 
QPushButton* firstButton = new QPushButton("First Button", this); 
QPushButton* secondButton = new QPushButton("Second Button", this); 
QPushButton* thirdButton = new QPushButton("Third Button", this); 

// Create your (custom) widgets 
QLabel* firstPageWidget = new QLabel("First Label", this); 
QLabel* secondPageWidget = new QLabel("Second Label", this); 
QLabel* thirdPageWidget = new QLabel("Third Label", this); 

// Add them to the stackWidget 
/*QStackedWidget* */ m_stackedWidget = new QStackedWidget(this); 
m_stackedWidget->addWidget(firstPageWidget); 
m_stackedWidget->addWidget(secondPageWidget); 
m_stackedWidget->addWidget(thirdPageWidget); 

// Insert buttons and stackWidget to CustomWidget 

QVBoxLayout* layoutStack = new QVBoxLayout(); 
layoutStack->addWidget(m_stackedWidget); 

QVBoxLayout* layoutButtons = new QVBoxLayout(); 
layoutButtons->addWidget(firstButton); 
layoutButtons->addWidget(secondButton); 
layoutButtons->addWidget(thirdButton); 

QHBoxLayout* layout = new QHBoxLayout(); 
layout->addLayout(layoutButtons); 
layout->addLayout(layoutStack); 
setLayout(layout); 

// Connect button clicks to slots 
connect(firstButton, SIGNAL(clicked()), this, SLOT(onFirstButtonClicked())); 
connect(secondButton, SIGNAL(clicked()), this, SLOT(onSecondButtonClicked())); 
connect(thirdButton, SIGNAL(clicked()), this, SLOT(onThirdButtonClicked())); 

然後你改變當前可見的部件在插槽:

void CustomWidget::onFirstButtonClicked() { 
    m_stackedWidget->setCurrentIndex(0); 
} 
void CustomWidget::onSecondButtonClicked() { 
    m_stackedWidget->setCurrentIndex(1); 
} 
void CustomWidget::onThirdButtonClicked() { 
    m_stackedWidget->setCurrentIndex(2); 
} 

請注意,如果你想要的按鈕點擊只是簡單地改變一些文字(相要更改可見窗口小部件),則最好使用QTextEdit而不是QStackedWidget,並在slot中調用setText("....");

如果您有很多按鈕,最好使用QSignalMapper來限制插槽的數量。

而且,我不知道爲什麼你提到QDockWidget,因爲他們有一個非常具體的用法:

的QDockWidget類提供了可以停靠QMainWindow中內部或浮動作爲一個頂級窗口小部件在桌面上。

QDockWidget提供了Dock部件的概念,也稱爲工具調色板或實用程序窗口。停靠窗口是放置在QMainWindow中的中央窗口小部件周圍的停靠窗口小部件區域中的次要窗口。

如果你只是想一個單獨的窗口,你可能會尋找一個QDialog

如何與QtDesigner做到這一點:

  1. 首先你會準備一個合適的用戶界面(包含3個按鈕和一個單一的QStackedWidget在右側區域以查看每個用戶控件後單擊添加的按鈕之一)。
  2. 添加在堆棧中的用戶控件3 頁(+一爲「空」的頁面,如果你真的很需要那)。如果您想在單獨的UI文件/僅在代碼中設計控件(而不是在您的MainFrame中的所有控件),您可以將它們的原始QWidget s和promote添加到適當的特定窗口小部件類型
  3. 將內容插入每個用戶控件...
  4. 爲上的三個按鈕實現代碼frmMain.cpp/.H爲以下(此實現,我們將實施「歡迎」按鈕承載對象名爲welcomeBtn,其餘的將具有相同代碼但是不同的用戶控制名稱):

    void FrmMain::on_welcomeBtn_clicked() { ui->stack->setCurrentWidget(ui->welcomeWidget); }

  5. 選擇設計器中當前頁面的「空白」頁面,因此程序在運行時最初會以這種方式結束:(您的屏幕截圖)

  6. 當您單擊「歡迎使用」按鈕時,結果應該是這樣的:(你的第二個截圖)
+0

謝謝你的時間!你真的幫了我很多:D –

0

首先是,我們不能強求別人怎麼框架運作的又一個。每個框架都有其流程和設計。

我明白你想顯示另一個部件到主窗口。 如果你想使用QDockWidget,它說,像這樣的文件上:

無效QDockWidget :: setWidget(QWidget的*插件)

設置小部件的對接窗口小部件小部件。
如果在添加小部件時可以看到擴展塢小部件,則必須明確顯示()。
請注意,在調用此函數之前,您必須添加小部件的佈局;如果不是,小部件將不可見。

請在這裏分享你的代碼myWidget,所以我們可以嘗試幫助你弄清楚什麼是錯的。

在我的身邊,我可以實現它在您的ui->dockwidget添加QVboxLayout與emtpy字符串添加QLabel,當你想顯示myWidget只是調用ui->dockwidget->vboxlayout->replaceWidget(label, myWidget);

0

在我看來,三木的答案是唯一正確的方法來使用這個用例(使用QStackedWidget)。

爲了完整起見,我將演示如何在同一清除和添加方法在.NET中使用的Qt中完成:

// Assume controlPanel is a QWidget where you want to place the items 
// Assume that controlPanel has set a layout (e.g. QHBoxLayout) 

// Clear: Remove all Items from layout 
QLayoutItem *child; 
while ((child = controlPanel->layout()->takeAt(0)) != NULL) { 
    delete child; 
} 

// Now widgets are still there, but not layouted. Delete them explicitly 
foreach (QWidget * w, controlPanel->findChildren<QWidget*>()) { 
    w->deleteLater(); 
} 

// Now controlPanel is cleared 

// Add new control 
controlPanel->layout()->addWidget(new MyNewControlWidget); 
+0

感謝您的代碼!你真的縮短了這個過程!我希望我可以投票...不幸的是,我缺乏這樣做的聲望(也許將來我會!):D –