QMainWindow和QWidget分别作为主窗体时对Layout的影响

最新写个小demo的时候,发现个问题,使用水平布局,最后所有的widget都堆在一起了,

分析得出的结论应该是layout出现错误了,

因为我使用qtcreator默认创建的是QMainWindow作为主窗体,

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

    QListWidget *m_leftList;
    QStackedWidget *m_stack;
    QLabel *label1;
    QLabel *label2;
    QLabel *label3;
};

是继承自QMainWindow的,所以在设置layout的时候需要使用下面的代码:

QWidget *w = new QWidget;
QHBoxLayout *mainLayout = new QHBoxLayout(w);
this->setCentralWidget(w);

完整代码:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QWidget *w = new QWidget;
    QHBoxLayout *mainLayout = new QHBoxLayout(w);
    this->setCentralWidget(w);

    m_leftList = new QListWidget(this);
    m_leftList->insertItem(0, tr("window1"));
    m_leftList->insertItem(1, tr("window2"));
    m_leftList->insertItem(2, tr("window3"));

    label1 = new QLabel(tr("windows1\n\t by craig"));
    label2 = new QLabel(tr("windows2\n\t by craig"));
    label3 = new QLabel(tr("windows3\n\t by craig"));

    m_stack = new QStackedWidget(this);
    m_stack->addWidget(label1);
    m_stack->addWidget(label2);
    m_stack->addWidget(label3);

    mainLayout->setMargin(5);
    mainLayout->setSpacing(5);
    mainLayout->addWidget(m_leftList);
    mainLayout->addWidget(m_stack, 0, Qt::AlignHCenter);
    mainLayout->setStretchFactor(m_leftList, 1);
    mainLayout->setStretchFactor(m_stack, 3);
    connect(m_leftList, SIGNAL(currentRowChanged(int)), m_stack, SLOT(setCurrentIndex(int)));

}

看来自己还是基础不扎实,需要多学习!大家可以分享自己的思路,谢谢

时间: 2024-10-25 23:24:35

QMainWindow和QWidget分别作为主窗体时对Layout的影响的相关文章

jquery easyui1.3.5使用window或dialog窗体时显示错位

新版本的easyUI里面,当我们使用到了window和dialog等窗体时,并且在不同浏览器上效果不同,即兼容性问题.Firefox浏览器上有个样式错乱:遮罩层跟窗体错位,而且窗体跑在上面看不到.这个我不知是不是新版本是否存在bug问题,我也是菜鸟一枚. 当出现这个问题的时候,只要在body里面指定宽高都为100%,即可解决这个问题. jquery easyui1.3.5使用window或dialog窗体时显示错位,布布扣,bubuko.com

WPF加载Winform窗体时 报错:子控件不能为顶级窗体

一.wpf项目中引用WindowsFormsIntegration和System.Windows.Forms 二.Form1.Designer.cs 的 partial class Form1 设置为:public partial class Form1 三.代码如下: XXXX.Form1 Zhuwindow = new XXXX.Form1(); Zhuwindow.TopLevel = false; Zhuwindow.FormBorderStyle = System.Windows.Fo

extjs中新建窗体时,给窗体添加背景图片不显示问题之一

1.在extjs中新建窗体时,给窗体添加背景图片不显示,例如下面的代码. 不显示的原因:因为设置了  layout: 'fit', Ext.create('Ext.Window', { title: '客户关系管理系统', width: 1024, height: 600, //plain: true, bodyStyle: 'background:url(images/登录背景.jpg);', headerPosition: 'top', layout: 'fit', items: { bor

winform退出或关闭窗体时弹窗提示代码:转

winform退出或关闭窗体时弹窗提示代码,当我们点击窗体的 X 按钮时,会弹出一个对话框,询问我们是直接退出,还是最小化到托盘,还是取消这个行为.或是是否保存当前修改等等.以下以最小化到托盘为例.        首先, 要确定已经将控件NotifyIcon拖到应用窗体中,属性name为notifyicon1. 然后, 双击窗体的FormClosing的事件 ,具码内容如下: private void Form1_FormClosing(object sender, FormClosingEve

winform 加载窗体时弹出另一个窗体并显示进度条的源码

winform 加载窗体时弹出另一个窗体并显示进度条的源码 //frmA: 源窗体 //------------------------------------------ //引用 using System.Threading; BackgroundWorker worker; public frmA() { InitializeComponent(); worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandl

WinForm实现最小化窗体时隐藏到系统托盘中

1.首先在工具栏中选择NotifyIcon控件拖入窗体中: 2.设置NotifyIcon控件的相关属性: Icon:在系统托盘中显示的图标: Text:当鼠标移动到系统托盘图标上时显示的文本: ContextMenuStrip:设置系统托盘的右键菜单,这个实现很简单,拖入一个右键菜单的控件,并在下拉列表框中选择就可以了. 3.添加相关代码 /// <summary> /// 窗体SizeChanged事件 /// </summary> /// <param name=&quo

关闭子窗体时刷新父窗体

父窗体:NoticeList.aspx:子窗体:NoticeInfo.aspx, 1.NoticeList.aspx中有按钮btnAdd,点击后弹出窗口NoticeInfo.aspx. 弹出窗体代码:1:新增弹出:javascript:window.open(NoticeInfo.aspx');: 2:编辑弹出:<a href=NoticeInfo.aspx?PID=<%#Eval("NewsID") %>' target="_blank">

c# winform 关闭窗体时同时结束线程实现思路(转)

前不久,做一个winform小程序,是给客户导数据用的.当时就发现调试的时候,线程有点问题,到某个点时就走不动了.但是运行确实没有问题的. 只是在关闭窗体后,资源管理器里,一大堆进程. 当时,客户急着用,小测了下,导出数据无误,进程就先不管了. 后来自己去查资料,发现只要在线程那里设置个属性 复制代码 代码如下: Thread th = new Thread(Excute); th.IsBackground = true;这样就解决问题了. 这个属性的意思就是把线程设置为后台线程. 然后关闭进程

C#屏蔽Alt+F4,解决Alt+F4关闭窗体时对话框NO后,线程不退出问题

//1.将窗体的属性KeyPrieview设置为true //keypreview属性为true的时候,就可以响应键盘事件v //2.在窗体KeyDown事件中加如下代码 private void Form1_KeyDown(object sender, KeyEventArgs e) { if( (e.KeyCode == Keys.F4)&&(e.Alt==true)) //屏蔽ALT+F4 { e.Handled = true; } } //e.Handled属性:获取或设置一个值,